本文へスキップ
BecomeCoder

SQL データ操作 (DML)コース · 第4章 データを変える · レッスン17

DELETE ― 行を削除する(と参照整合性)

ブラウザで完結

導入

不要になった行を消すのが DELETE です。CRUD の最後、Delete にあたります。使い方は UPDATE と似ていて、「どの行を消すか」を WHERE で指定します。あわせて、「消してよい行か」を守る 参照整合性 という考え方にも触れます。

説明

DELETE FROM テーブルWHERE で条件を付けます。

DELETE FROM order_items WHERE quantity >= 3;

これで数量が3以上の明細だけが消えます。何行消えたかは「◯ 行に影響」で表示され、結果は SELECT で確認できます。

⚠ WHERE のない DELETE は全削除。 DELETE FROM order_items; と書くと、全行が消えます。元に戻せない操作なので、実務では特に慎重に。消す前に、同じ WHERESELECT して「消える行がこれで合っているか」を必ず確認します。

消すのは「行」であって、テーブルそのものは残ります(列の定義や空のテーブルは残る)。テーブルごと消したいときは、次章で学ぶ 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;

実際に動かしてみよう

下のエディタにクエリを書いて「実行」を押すと、ブラウザ内のSQLiteで結果が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう。

SQL — ブラウザ内で実行(SQLite)

ブラウザ内でSQLを動かす環境(SQLite)を読み込みます(初回のみ一瞬)。
スクロールして表示された時点でも自動で読み込まれます。