删除
は,テブルの行を削除するDMLステトメントです。
単一テブル構文
删除[low_priority] [quick] [ignore] fromtbl_name(分区(partition_name,……)]where_condition[由…][限制row_count]
删除
ステトメントは,tbl_name
の行を削除し,削除された行数を返します。削除された行数をチェックするには,セクション12.14 "情報関数"で説明されているROW_COUNT ()
関数を呼び出します。
メ邮箱ンの句
オプションの在哪里
句内の条件は,どの行を削除するかを識別します。在哪里
句がない場合は,すべての行が削除されます。
where_condition
は,削除される各行に対して真に評価される式です。これは,セクション13.2.9 " select構文"で説明されているように指定されます。
命令
句が指定されている場合は,指定されている順序で行が削除されます。限制
句は,削除できる行数に制限を設定します。これらの句は単一テブルの削除に適用されますが,複数テブルの削除には適用されません。
複数テブル構文
删除[low_priority] [quick] [ignore]tbl_name(。*] [,tbl_name(。*]]…从table_references(在哪里where_condition]
または:
删除[low_priority] [quick] [ignore] fromtbl_name(。*] [,tbl_name(。*]]…使用table_references(在哪里where_condition]
権限
テブルから行を削除するには,そのテブルに対する删除
権限が必要です。在哪里
句で指定されているカラムなどの,読み取られるだけのカラムに対しては,选择
権限のみが必要です。
パフォマンス
削除された行数を知る必要がない場合,テ,ブルを空にするには,在哪里
句のない删除
ステトメントより截断表
ステトメントの方が高速です。删除
とは異なり,截断表
はトランザクション内で,またはそのテブルがロックされている場合は使用できません。セクション13.1.33 " truncate table構文"およびセクション13.3.5 "锁定表および解锁表構文"を参照してください。
削除操作の速度はまた,セクション8.2.2.3 " deleteステトメントの速度"で説明されている要因によって影響を受ける可能性もあります。
特定の删除
ステトメントに時間がかかりすぎないようにするために,删除
のMySQL固有の限制
句は,削除される行の最大数を指定します。削除する行数がこの制限を超えている場合は、影響を受ける行数がrow_count
限制
値を下回るまで删除
ステトメントを繰り返します。
サブクエリ
現在,テブルから削除し,さらにサブクエリブルから選択することはできません。
パティション化されたテブル
MySQL 5.6.2から,删除
は,削除される行を選択する1つ以上のパーティションまたはサブパーティション(またはその両方)の名前のカンマ区切りリストを含む分区
オプションを使用した明示的なパティション選択をサポトしています。このリストに含まれていないパティションは無視されます。p0
という名前のパティションを含むパティション化されたテブルt
がある場合,ステトメント删除t分区(p0)
の実行には,このテブルに対して修改表截断分区(p0)
を実行するのと同じ効果があります。どらの場合も,パティションp0
内のすべての行が削除されます。
分区
は,在哪里
条件とともに使用できます。その場合,この条件は,リストされているパ,ティション内の行に対してのみテストされます。たとえば,删除c < 5的分区
は,条件c < 5
がtrueであるパティション.使用实例p0
の行のみを削除します。ほかのパティション内の行はチェックされないため,删除
によって影響を受けません。
分区
オプションはまた,複数テブルの删除
ステトメントでも使用できます。このようなオプションを,从
オプションで指定されているテブルごとに最大1使用できます。
詳細および例にいては,セクション19.5 "パティション選択"を参照してください。
自動邮箱ンクリメントカラム
AUTO_INCREMENT
カラムに最大値を含む行を削除した場合,その値は,MyISAM
またはInnoDB
テブルには再利用されません。自动提交
モドで删除从
(tbl_name
在哪里
句はなし)を使用してテブル内のすべての行を削除した場合,そのシケンスは,InnoDB
とMyISAM
を除くすべてのストレジエンジンに対して開始されます。セクション14.6.5 " InnoDBでのAUTO_INCREMENT処理"で説明されているように,InnoDB
テブルに対しては,この動作の例外がいく。
MyISAM
テブルの場合は,マルチカラムキ内のAUTO_INCREMENT
セカンダリカラムを指定できます。この場合は,シーケンスの先頭から削除された値の再利用がMyISAM
テブルに対しても実行されます。セクション3.6.9 " auto_incrementの使用"を参照してください。
修飾子
删除
ステトメントは,次の修飾子をサポトします。
LOW_PRIORITY
を指定した場合,サ,ほかのどのクラ删除
の実行を遅延させます。これは,テーブルレベルロックのみを使用するストレージエンジン (MyISAM
、内存
,および合并
にのみ影響を与えます。MyISAM
テブルでは,快速
キワドを使用した場合,ストレ。これにより,一部の種類の削除操作が高速化される可能性があります。忽略
キーワードを指定すると,MySQLは行削除プロセス中のエラーを無視します。(解析の段階で検出されたエラーは,通常の方法で処理されます)。忽略
の使用のために無視されたエラは,警告として返されます。
削除の順序
删除
ステトメントに命令
句が含まれている場合は,この句で指定されている順序で行が削除されます。これは,主に限制
と組み合わせて使用した場合に有効です。たとえば,次のステトメントは在哪里
句に一致する行を見け,それらをtimestamp_column
でソトしたあと,最初の(もっとも古い)行を削除します。
删除用户为“jcole”的日志
命令
はまた,参照整合性の違反を回避するために必要な順序で行を削除する場合も役立ます。
InnoDBテブル
大きなテブルから多数の行を削除する場合は,InnoDB
テブルに対するロックテブルのサズを超える可能性があります。この問題を回避するために,または単にテ,ブルがロックされたままになる時間を最小限に抑えるために,删除
をまったく使用しない次の方法が有効な場合があります。
削除されない行を選択して,元のテ。
INSERT INTO t_copy SELECT * FROM…;
重命名表
を使用して元のテブルを原子的に移動したあと,コピの名前を元の名前に変更します。重命名表t为t_old, t_copy为t
元のテブルを削除します。
删除表t_old;
重命名表
が実行されている間,関連するテーブルにはほかのどのセッションからもアクセスできないため,名前変更の操作は並列性の問題に制約されません。セクション13.1.32 " rename table構文"を参照してください。
MyISAMテブル
MyISAM
テブルでは,削除された行はリンクリスト内に保持され,以降の插入
操作は古い行の位置を再利用します。未使用領域を再利用し,ファ邮箱ルサ邮箱ズを減らすには,优化表
ステトメントまたはmyisamchkユティリティを使用してテブルを再編成します。优化表
の方が使い方は簡単ですが,myisamchkの方が高速です。セクション13.7.2.4 "优化表構文"およびセクション4.6.3 "myisamchk- MyISAMテブルメンテナンスユティリティ”を参照してください。
快速
修飾子は,削除操作で。快速删除
は,削除された行のインデックス値が,あとで挿入された行の同様のインデックス値に置き換えられるアプリケーションで,特に役立ちます。この場合,削除された値によって残された穴は再利用されます。
快速删除
は,削除された値によって,新しい挿入が再度発生するインデックス値の範囲全体にわたって空きのあるインデックスブロックが残される場合には役立ちません。この場合は,快速
を使用すると、再利用されないままの以及ンデックスで領域が浪費される可能性があります。このようなシナリオの例を次に示します。
ンデックス付き
AUTO_INCREMENT
カラムを含むテブルを作成します。このテブルに多数の行を挿入します。各挿入によって、ンデックスの先頭に追加される、ンデックス値が生成されます。
快速删除
を使用して,カラムの範囲の最後にある行のブロックを削除します。
このシナリオでは,削除された邮箱ンデックス値に関連付けられた邮箱ンデックスブロックに空きができますが,快速
が使用されているため、ほかの。新しい挿入が発生したとき,新しい行には削除された範囲内のインデックス値が含まれていないため,これらのインデックスブロックは空きがあるままになります。さらに,削除された一部のインデックス値が偶然に空きのあるブロック内か,またはその隣のインデックスブロックに含まれていないかぎり,あとで快速
なしで删除
を使用した場合でも空きがあるままになります。これらの状況で未使用のンデックス領域を再利用するには,优化表
を使用します。
テブルから多数の行を削除しようとしている場合は,快速删除
に続けて优化表
を使用した方が高速になることがあります。これにより,インデックスブロックの多数のマージ操作が実行されるのではなく,インデックスが再構築されます。
複数テブルの削除
在哪里
句内の条件に応じて1以上のテブルから行を削除するには,删除
ステトメントで複数のテブルを指定できます。複数テブルの删除
では,命令
または限制
を使用できません。セクション13.2.9.2 " join構文"で説明されているように,table_references
句は,結合に含まれるテブルをリストします。
最初の複数テブル構文では,从
句の前にリストされているテブルの一致する行のみが削除されます。2番目の複数テブル構文では,使用
句の前にある从
句にリストされているテブルの一致する行のみが削除されます。その効果は,多数のテーブルの行を同時に削除し,さらに検索にのみ使用される追加のテーブルを指定できることです。
DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2id和t2.id = t3.id;
または:
DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2id和t2.id = t3.id;
これらのステートメントは,削除する行を検索するときに3つのすべてのテーブルを使用しますが,テーブルt1
とt2
の一致する行のみを削除します。
前の例では内连接
を使用していますが,複数テブルの删除
ステトメントは,选择
ステトメント内で許可されているほかの型の結合(左连接
など)を使用できます。たとえば,t1
内に存在する行でt2
内に一致するものがない行を削除するには,左连接
を使用します。
DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2。id t2的地方。id为空;
この構文では,访问との互換性のために,各tbl_name
のあとに. *
が許可されます。
外部キ制約が存在するInnoDB
テブルを含む,複数テブルの删除
ステートメントを使用した場合は,MySQLオプティマイザが,それらの親子関係の順序とは異なる順序でテーブルを処理する可能性があります。この場合,このステ,トメントは失敗し,ロ,ルバックされます。代わりに,1のテブルから削除したあと,InnoDB
が提供する在删除
機能を使用して,ほかのテブルがそれに応じて変更されるようにしてください。
テーブルのエイリアスを宣言した場合は,テーブルを参照するときにそのエイリアスを使用する必要があります。
删除t1 FROM test AS t1, WHERE…
複数テブルの删除
内のテtable_references
部分でのみ宣言するようにしてください。それ以外の場所では,エ,リアス参照が許可されますが,エ,リアス宣言は許可されません。
正しい:
删除a1, a2 FROM t1 AS a1 INNER JOIN t2 AS a2 WHERE a1.id=a2.idWHERE a1.id=a2.id; WHERE a1.id=a2.id;
正しくない:
删除t1 AS a1, t2 AS a2 FROM t1 INNER JOIN t2 WHERE a1.id=a2.id;删除t1 AS a1, t2 AS a2 USING t1 INNER JOIN t2 WHERE a1.id=a2.id;