導入
不要になった行を消すのが DELETE です。CRUD の最後、Delete にあたります。使い方は UPDATE と似ていて、「どの行を消すか」を WHERE で指定します。あわせて、「消してよい行か」を守る 参照整合性 という考え方にも触れます。
説明
DELETE FROM テーブル に WHERE で条件を付けます。
DELETE FROM order_items WHERE quantity >= 3;
これで数量が3以上の明細だけが消えます。何行消えたかは「◯ 行に影響」で表示され、結果は SELECT で確認できます。
⚠ WHERE のない DELETE は全削除。 DELETE FROM order_items; と書くと、全行が消えます。元に戻せない操作なので、実務では特に慎重に。消す前に、同じ WHERE で SELECT して「消える行がこれで合っているか」を必ず確認します。
消すのは「行」であって、テーブルそのものは残ります(列の定義や空のテーブルは残る)。テーブルごと消したいときは、次章で学ぶ DROP TABLE を使います。
参照整合性 ― つながりを壊さない。 ここで注意が要ります。たとえば「まだ注文が残っている会員(users)を消す」と、その注文の user_id は存在しない会員を指してしまいます。これはデータの矛盾(迷子の注文)です。
flowchart LR
U["users: 佐藤(id=1) を削除"] -->|"すると…"| O["orders: user_id=1 の注文が<br/>“存在しない会員”を指す迷子に"]
O --> X["これが参照整合性の破れ"]
「子(orders)が親(users)を参照しているなら、先に子を消すか、そもそも親を消させない」――こうした整合性のルールは、次章で学ぶ 外部キー制約 を使うと、データベース自身に守らせることができます。
やってみよう
初期表示の DELETE を実行し、SELECT * FROM order_items; で数量3以上の明細が消えたことを確認しましょう。試し終わったら「DBを初期状態に戻す」で元に戻せます。
演習
order_items テーブルから、商品(product_id)が 2(マウス)の明細をすべて削除してください。
ヒント1を見る
数値の条件なのでクオートは不要です。WHERE product_id = 2
ヒント2を見る
DELETE FROM order_items WHERE product_id = 2;