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 です。
例
- まず見て、それから削除する
WHERE を SELECT として書き、これから失う行を読んでください。
WHERE はそのままにします。
DELETE は影響を受けた行数だけを報告します。UPDATE は Rows matched と
Changed を含む 2 行目を出力しますが、DELETE にそれに相当するものはありません。
- 何にも一致しない 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を使います。元に戻せないことを承知の上で使ってください。
関連項目
- UPDATE — 行の変更と、セーフアップデートの保護
- WHERE — どの行が消えるかを決める句
- トランザクション — DELETE を取り消す唯一の方法
- MySQL のソフトデリート — 行を削除する代わりに、削除済みとして印を付ける