単一テーブルの構文:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [WHERE where_definition] [ORDER BY ...] [LIMIT row_count]
複数テーブルの構文:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] tbl_name[.*] [, tbl_name[.*] ...] FROM table_references [WHERE where_definition]
または:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name[.*] [, tbl_name[.*] ...] USING table_references [WHERE where_definition]
tbl_name 一部の行は、where_developmentで指定された条件を満たします。 DELETE はこれらの行を削除するために使用され、削除されたレコードの数を返します。
WHERE 句を指定せずに DELETE ステートメントを作成すると、すべての行が削除されます。削除された行の数を知りたくない場合は、TRUNCATE TABLE を使用するより速い方法があります。
削除した行に AUTO_INCREMENT 列の最大値が含まれている場合、その値は BDB テーブルで再利用されますが、MyISAM テーブルや InnoDB テーブルでは再利用されません。 AUTOCOMMIT モードで DELETE FROM tbl_name (WHERE 句なし) を使用してテーブル内のすべての行を削除すると、シーケンスはすべてのテーブル タイプ (InnoDB と MyISAM を除く) で並べ替えられます。
MyISAM テーブルと BDB テーブルの場合、複数列キーワードに AUTO_INCREMENT セカンダリ列を指定できます。この場合、MyISAM テーブルであっても、シーケンスの先頭から削除された値が再度使用されます。
DELETE ステートメントは次の修飾子をサポートしています:
· LOW_PRIORITY を指定すると、他のクライアントがこのテーブルを読み取らなくなるまで DELETE の実行が遅延されます。
· MyISAM テーブルの場合、QUICK キーワードを使用すると、ストレージ エンジンは削除プロセス中にインデックス終了ノードをマージしません。これにより、一部の種類の削除操作が高速化されます。
· 行の削除プロセス中に、IGNORE キーワードにより MySQL はすべてのエラーを無視します。 (分析フェーズ中に発生したエラーは通常の方法で処理されます。) このオプションの使用により無視されたエラーは、警告として返されます。
MyISAM テーブルでは、削除されたレコードはリンクされたリストに保持され、後続の INSERT 操作では古いレコードの場所が再利用されます。未使用のスペースを再利用してファイル サイズを減らすには、OPTIMIZE TABLE ステートメントまたは myisamchk アプリケーションを使用してテーブルを再編成します。 OPTIMIZE TABLE の方が簡単ですが、myisamchk の方が高速です。
QUICK 修飾子は、削除操作中にインデックス終了ノードがマージされるかどうかに影響します。 DELETE QUICK は、削除された行のインデックス値が、後で挿入された行の同様のインデックス値に置き換えられる場合に最も役立ちます。この場合、削除された値によって残された穴は再利用されます。
フルではないインデックス ブロックがインデックス値の特定の範囲にまたがる場合、新しい挿入が発生します。削除された値によってインデックス ブロックがアンダーフィルされる場合、DELETE QUICK は効果がありません。この場合、QUICK を使用すると、未使用のインデックスに無駄なスペースが生じる可能性があります。以下はこの状況の例です:
1. インデックス付き AUTO_INCREMENT 列を含むテーブルを作成します。
2. テーブルに多数のレコードを挿入します。挿入ごとにインデックス値が生成され、インデックスの上位に追加されます。
3. DELETE QUICK を使用して、列の下端からレコードのグループを削除します。
この場合、削除されたインデックス値に関連するインデックスブロックはアンダーフィルになりますが、QUICKの使用により、これらのインデックスブロックは他のインデックスブロックとマージされません。新しい値が挿入されると、新しいレコードには削除された範囲内のインデックス値が含まれないため、これらのインデックス ブロックはアンダーフィルされたままになります。さらに、後で QUICK を含めずに DELETE を使用した場合でも、削除されたインデックス値の一部がこれらの未埋めのブロック内または隣接する場合を除き、これらのインデックス ブロックは未埋めのままです。このような場合、未使用のインデックス領域を再利用したい場合は、OPTIMIZE TABLE を使用します。
テーブルから多くの行を削除する予定がある場合は、DELETE QUICK と OPTIMIZE TABLE を組み合わせて使用すると、処理を高速化できます。これにより、多数のインデックス ブロックのマージ操作を実行するのではなく、インデックスが再作成されます。
MySQL のユニークな LIMIT for DELETE row_count オプションは、制御コマンドがクライアントに返される前に削除できる最大行数をサーバーに通知するために使用されます。このオプションは、DELETE ステートメントに時間がかかりすぎないようにするために使用されます。関連する行の数が LIMIT 値より少なくなるまで、DELETE ステートメントを繰り返すことができます。
DELETE ステートメントに ORDER BY 句が含まれる場合、行は句で指定された順序で削除されます。この句は、LIMIT と組み合わせて使用した場合にのみ機能します。たとえば、次の句は、WHERE 句に対応する行を検索し、分類に timestamp_column を使用し、最初の (最も古い) 行を削除するために使用されます。
DELETE FROM somelog WHERE user = 'jcole' ORDER BY timestamp_column LIMIT 1;
複数の Deletes 行に基づいて、1 つの DELETE ステートメントで複数のテーブルを指定できます。テーブル内の特定の条件に基づいた 1 つまたは複数のテーブル。ただし、複数テーブルの DELETE ステートメントでは ORDER BY または LIMIT を使用できません。
table_references セクションには、ユニオンに含まれるテーブルがリストされます。
最初の構文では、FROM 句の前にリストされているテーブル内の対応する行のみを削除します。 2 番目の構文では、FROM 句 (USING 句の前) にリストされているテーブル内の対応する行のみが削除されます。これにより、多くのテーブルから行を同時に削除し、他のテーブルを使用して検索できるようになります:
DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
または:
DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
削除する行を検索する場合、これらのステートメントは 3 つのテーブルすべてを使用しますが、 table t1 と table t2 の対応する行を削除します。
以上例子显示了使用逗号操作符的内部联合,但是多表DELETE语句可以使用SELECT语句中允许的所有类型的联合,比如LEFT JOIN。
本语法允许在名称后面加.*,以便与Access相容。
如果您使用的多表DELETE语句包括InnoDB表,并且这些表受外键的限制,则MySQL优化程序会对表进行处理,改变原来的从属关系。在这种情况下,该语句出现错误并返回到前面的步骤。要避免此错误,您应该从单一表中删除,并依靠InnoDB提供的ON DELETE功能,对其它表进行相应的修改。
注释:当引用表名称时,您必须使用别名(如果已给定):
DELETE t1 FROM test AS t1, test2 WHERE ...
进行多表删除时支持跨数据库删除,但是在此情况下,您在引用表时不能使用别名。举例说明:
DELETE test1.tmp1, test2.tmp2 FROM test1.tmp1, test2.tmp2 WHERE ...
目前,您不能从一个表中删除,同时又在子查询中从同一个表中选择。
以上就是MySQL基础教程15 —— SQL语法之数据操作语句DML——DELETE语法的内容,更多相关内容请关注PHP中文网(www.php.cn)!