DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table_name [WHERE where_definition] [ORDER BY ...] [LIMIT row_count] または DELETE [LOW_PRIORITY] [QUICK] [IGNORE] table_name[.*] [, table_name[.*] ...] FROM table-references [WHERE where_definition] または DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table_name[.*] [, table_name[.*] ...] USING table-references [WHERE where_definition]
DELETE
は、where_definition
で指定されている条件にマッチするレコードを、table_name
に指定されているテーブルから削除し、削除したレコードの数を返します。
WHERE
節が指定されていない
DELETE
では、すべてのレコードが削除されます。AUTOCOMMIT
モードで実行された場合、WHERE
節なしの DELETE
は
TRUNCATE
と同じように動作します。See
項6.4.6. 「TRUNCATE
構文」。MySQL 3.23
では、WHERE
節のない
DELETE
は影響を受けたレコード数として値ゼロを返します。
すべてのレコードの削除時に、削除されたレコード数を確認する必要がある場合、処理速度が遅くなってもかまわなければ、次の形式の
DELETE
ステートメントを使用できます。
mysql> DELETE FROM table_name WHERE 1>0;
注意: この形式の場合、レコードが一度に 1
つずつ削除されるため、WHERE
節のない DELETE FROM table_name
よりはるかに処理が遅くなります。
キーワード LOW_PRIORITY
が指定されていると、他のクライアントによるそのテーブルからの読み取りがなくなるまで、DELETE
の実行は遅らされます。
MyISAM テーブルの場合、QUICK
という語が指定されていると、削除時にストレージエンジンでインデックスのリーフをマージしません。そのため、一部の削除操作では、処理が迅速化されます。
削除操作の速度は、項5.2.12. 「DELETE
クエリの速度」
で説明している要因にも影響されます。
オプション IGNORE
が指定されていると、MySQL
はレコードの削除中にすべてのエラーを無視します。解析段階で発生したエラーは通常の方法で処理されます。このオプションの使用によって無視されたエラーは警告として返されます。このオプションはバージョン
4.1.1 で導入されました。
MyISAM
テーブルの場合、削除されたレコードはリンクされたリストに維持され、元のレコード位置が後続の
INSERT
操作で再利用されます。使用されていないスペースを取り戻してファイルのサイズを削減するには、OPTIMIZE
TABLE
ステートメントまたは
myisamchk
ユーティリティを使用してテーブルを再編成します。
この場合、OPTIMIZE TABLE
の方が簡単ですが、myisamchk
の方が処理が迅速です。項4.6.1. 「OPTIMIZE TABLE
構文」
および 項4.5.6.10. 「テーブルの最適化」
を参照してください。
複数テーブルの削除の最初の形式は、MySQL 4.0.0 以降でサポートしています。 複数テーブルの削除の 2 番目の形式は、MySQL 4.0.2 以降でサポートしています。
複数テーブルの削除では、FROM
節の前、または
USING
節の前にリストされたテーブル内の一致するレコードのみが削除されます。そのため、多くのテーブルのレコードを一度に削除できるとともに、検索に使用するその他のテーブルを指定することができます。
テーブル名の後に .*
を付けるのは、単に Access
との互換性を確保するためです。
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
これらの例では、テーブル t1
と
t2
内の一致するレコードだけが削除されます。
上の例ではカンマ演算子を使用した内部結合を示していますが、複数テーブルの
DELETE
ステートメントでは、LEFT JOIN
など、SELECT
ステートメントで使用可能な任意の結合型を使用することができます。
ORDER BY
が使用されている場合(MySQL 4.0.0
以降で使用可能)、レコードは指定された順序で削除されます。ORDER
BY
節は、実際には、LIMIT
と組み合わせて使用した場合にのみ役立ちます。次に例を示します。
DELETE FROM somelog WHERE user = 'jcole' ORDER BY timestamp LIMIT 1
この場合、 WHERE
節の指定に一致するレコードで最も古いエントリ(timestamp
値に基づく)が削除されます。
DELETE
に MySQL
固有のオプションである LIMIT
row_count
を指定すると、クライアントに制御を戻す前に削除する最大レコード数をサーバに指示することができます。このオプションは、特定の
DELETE
コマンドで実行にあまり時間がかからないようにする必要があるときに使用できます。この場合、影響を受けたレコードの数が
LIMIT
値よりも小さくなるまで、DELETE
コマンドを単純に繰り返すことができます。
MySQL 4.0 以降では、DELETE
ステートメントに複数のテーブルを指定することによって、複数テーブルにおける特定の条件に応じて、1
つ以上のテーブルからレコードを削除することができます。しかし、複数テーブルの
DELETE
では、ORDER BY
と LIMIT
はいずれも使用できません。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.