メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
DELETE は行全体を削除します。トランザクションの 外では元に戻せないため、身に付ける価値のある習慣は、まず WHERE を書いて、 それが何を選ぶかを見ることです。 これらの例は INSERT の sakila_practice データベースを 使います。始める前にそこのセットアップブロックをもう一度実行し、それから mysql -u root -p sakila_practice でクライアントを開いてください。

DELETE の仕組み

TABLE_NAME をテーブルに、CONDITION を削除する行を選ぶテストに置き換えます。 列リストはありません。DELETE は行全体を削除するため、1 つの列を空にするのは、 それを NULL に設定する UPDATE です。

例

  1. まず見て、それから削除する

WHERE を SELECT として書き、これから失う行を読んでください。
1 行で、それは意図した行です。次に、文の前半を変え、WHERE はそのままにします。
DELETE は影響を受けた行数だけを報告します。UPDATE は Rows matched と Changed を含む 2 行目を出力しますが、DELETE にそれに相当するものはありません。

  1. 何にも一致しない WHERE はエラーではない

何も問題は起きず、何も起きませんでした。動くはずだった削除の後の 0 rows affected は、WHERE が間違っているという意味ですが、文はそれを教えて くれません。

WHERE がないとテーブルを空にする

セーフアップデートモードは、WHERE にキーのない UPDATE を拒否するのとまったく 同じように、この形を拒否します。UPDATE でそれが出す ERROR 1175 を示しており、mysql -u root -p --safe-updates sakila_practice で セッション全体に対して有効にできます。

TRUNCATE は別の方法で空にする

テーブルは空なので、1 行挿入してその id を見てください。
カウンタは DELETE が削除した行の続きから進みました。TRUNCATE TABLE はそう しません。
TRUNCATE はテーブルを削除して空のテーブルを作り直します。何行削除しても 0 rows affected と報告するのも、カウンタが最初から始まるのもそのためです。 WHERE を取らず、ロールバックできず、DELETE トリガーを起動しません。テーブルを 空の状態にリセットするには TRUNCATE を、それ以外のすべてには DELETE を使って ください。

まとめ

  • DELETE FROM table WHERE condition と書き、まず WHERE を SELECT として実行します。
  • 行数が返り、Rows matched の行はないと考えてください。
  • 0 rows affected は失敗ではなく、何も見つけなかった WHERE と読んでください。
  • WHERE を省くとテーブルは空になり、確認のステップはありません。
  • テーブルを空にしてリセットするには TRUNCATE TABLE を使います。元に戻せないことを承知の上で使ってください。

関連項目