ホームページ  >  記事  >  データベース  >  mysql——構文の削除

mysql——構文の削除

伊谢尔伦
伊谢尔伦オリジナル
2016-11-23 10:30:051519ブラウズ

単一テーブルの構文:

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 の DELETE 用の唯一の LIMIT 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 ステートメントでは、LEFT JOIN など、SELECT ステートメントで許可されているすべての種類の結合を使用できます。

本语法允许在名称后面加.*,以便与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 ...

目前,您不能从一个表中删除,同时又在子查询中从同一个表中选择。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。