10bet网址
MySQL 5.6リファレンスマニュアル
本手册下载
PDF (Ltr)- 26.8 mb
PDF (A4)- 26.8 mb


13.2.2 delete構文

删除は,テブルの行を削除する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在哪里句はなし)を使用してテブル内のすべての行を削除した場合,そのシケンスは,InnoDBMyISAMを除くすべてのストレジエンジンに対して開始されます。セクション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テブルに対するロックテブルのサズを超える可能性があります。この問題を回避するために,または単にテ,ブルがロックされたままになる時間を最小限に抑えるために,删除をまったく使用しない次の方法が有効な場合があります。

  1. 削除されない行を選択して,元のテ。

    INSERT INTO t_copy SELECT * FROM…;
  2. 重命名表を使用して元のテブルを原子的に移動したあと,コピの名前を元の名前に変更します。

    重命名表t为t_old, t_copy为t
  3. 元のテブルを削除します。

    删除表t_old;

重命名表が実行されている間,関連するテーブルにはほかのどのセッションからもアクセスできないため,名前変更の操作は並列性の問題に制約されません。セクション13.1.32 " rename table構文"を参照してください。

MyISAMテブル

MyISAMテブルでは,削除された行はリンクリスト内に保持され,以降の插入操作は古い行の位置を再利用します。未使用領域を再利用し,ファ邮箱ルサ邮箱ズを減らすには,优化表ステトメントまたはmyisamchkユティリティを使用してテブルを再編成します。优化表の方が使い方は簡単ですが,myisamchkの方が高速です。セクション13.7.2.4 "优化表構文"およびセクション4.6.3 "myisamchk- MyISAMテブルメンテナンスユティリティ”を参照してください。

快速修飾子は,削除操作で。快速删除は,削除された行のインデックス値が,あとで挿入された行の同様のインデックス値に置き換えられるアプリケーションで,特に役立ちます。この場合,削除された値によって残された穴は再利用されます。

快速删除は,削除された値によって,新しい挿入が再度発生するインデックス値の範囲全体にわたって空きのあるインデックスブロックが残される場合には役立ちません。この場合は,快速を使用すると、再利用されないままの以及ンデックスで領域が浪費される可能性があります。このようなシナリオの例を次に示します。

  1. ンデックス付きAUTO_INCREMENTカラムを含むテブルを作成します。

  2. このテブルに多数の行を挿入します。各挿入によって、ンデックスの先頭に追加される、ンデックス値が生成されます。

  3. 快速删除を使用して,カラムの範囲の最後にある行のブロックを削除します。

このシナリオでは,削除された邮箱ンデックス値に関連付けられた邮箱ンデックスブロックに空きができますが,快速が使用されているため、ほかの。新しい挿入が発生したとき,新しい行には削除された範囲内のインデックス値が含まれていないため,これらのインデックスブロックは空きがあるままになります。さらに,削除された一部のインデックス値が偶然に空きのあるブロック内か,またはその隣のインデックスブロックに含まれていないかぎり,あとで快速なしで删除を使用した場合でも空きがあるままになります。これらの状況で未使用のンデックス領域を再利用するには,优化表を使用します。

テブルから多数の行を削除しようとしている場合は,快速删除に続けて优化表を使用した方が高速になることがあります。これにより,インデックスブロックの多数のマージ操作が実行されるのではなく,インデックスが再構築されます。

複数テブルの削除

在哪里句内の条件に応じて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つのすべてのテーブルを使用しますが,テーブルt1t2の一致する行のみを削除します。

前の例では内连接を使用していますが,複数テブルの删除ステトメントは,选择ステトメント内で許可されているほかの型の結合(左连接など)を使用できます。たとえば,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;

本手册下载
PDF (Ltr)- 26.8 mb
PDF (A4)- 26.8 mb