MySQL DELETE 文
MySQLにおける DELETE ステートメントは、テーブルから既存の行(レコード)を削除するために使用されます。データの修正を行う UPDATE とは異なり、DELETE はレコード全体を永久に抹消します。特定のデータ行を削除する必要がある場合、DELETE ステートメントは不可欠なツールとなります。
1. 基本的な DELETE ステートメント
レコードを削除する最も直接的な方法は、データを削除したいテーブルを指定することです。
DELETE FROM your_table_name; 危険警告:WHERE 句を指定せずに DELETE FROM your_table_name; を実行すると、そのテーブル内のすべての行が削除されます。これは極めて破壊的な操作であり、細心の注意を払って使用する必要があります。DELETE ステートメントを実行する前に、必ず WHERE 句を繰り返し確認してください。
デモンストレーションのために、以下のような products(製品)テーブルがあると仮定します。
| product_id (製品ID) | name (名称) | category (カテゴリ) | price (価格) | stock_quantity (在庫数) |
|---|---|---|---|---|
| 1 | Laptop | Electronics | 1200 | 50 |
| 2 | Mouse | Electronics | 25 | 200 |
| 3 | Keyboard | Electronics | 75 | 150 |
| 4 | Desk Chair | Furniture | 300 | 30 |
| 5 | Table Lamp | Home Decor | 40 | 80 |
| 6 | Monitor | Electronics | 400 | 70 |
2. WHERE 句を使用した特定行の削除
特定のレコードのみを削除するには、WHERE 句を含める必要があります。この句によってデータ行がフィルタリングされ、指定された条件に一致するレコードのみが削除されるようになります。これは SELECT や UPDATE ステートメントで WHERE を使用する方法と非常に似ています。
例えば、product_id が 5 の製品(Table Lamp / デスクライト)を削除したい場合:
DELETE FROM products
WHERE product_id = 5;この操作を実行すると、products テーブルは以下のようになります(5行目が永久に削除されます)。
| product_id | name | category | price | stock_quantity |
|---|---|---|---|---|
| 1 | Laptop | Electronics | 1200 | 50 |
| 2 | Mouse | Electronics | 25 | 200 |
| 3 | Keyboard | Electronics | 75 | 150 |
| 4 | Desk Chair | Furniture | 300 | 30 |
| 6 | Monitor | Electronics | 400 | 70 |
WHERE 句では、AND、OR、NOT を組み合わせた任意の有効な条件を使用でき、>、<、>=、<=、=、!=、LIKE、IN、BETWEEN、IS NULL などの演算子が利用可能です。
2.1 カテゴリに基づいた複数行の削除
'Home Decor'(インテリア)カテゴリに属するすべての製品を削除するとします。
DELETE FROM products
WHERE category = 'Home Decor';テーブルに 'Home Decor' のアイテムが含まれている場合、このステートメントはそれらをすべて削除します。
2.2 低在庫の行を削除
在庫がほとんどなく、再入荷の予定もない製品(例:stock_quantity が 10 未満)を削除したい場合。
DELETE FROM products
WHERE stock_quantity < 10;2.3 価格とカテゴリの組み合わせによる削除
価格が 50ドル未満の 'Electronics'(電子機器)をすべて削除することを検討します。
DELETE FROM products
WHERE category = 'Electronics' AND price < 50;このステートメントは AND を使用して2つの条件を組み合わせ、両方の条件を同時に満たす行(今回の例では product_id が 2 の 'Mouse')のみが削除されるようにします。
3. DELETE ステートメントの実行フロー
レコードの削除プロセスは、常に条件をチェックして正しいデータを特定するステップを伴います。
- DELETE ステートメントの開始
- WHERE 句が存在するか?
- いいえ: テーブル内のすべての行を削除。
- はい: 各行に対して WHERE 句を評価。
- 現在の行は WHERE 条件に一致するか?
- はい: 現在の行を削除。
- いいえ: 現在の行を保持。
- すべての行を処理し終わるまで、次の行のチェックを継続。
- DELETE ステートメントの終了
4. WHERE 句とトランザクション制御の重要性
WHERE 句は正確なデータ操作のために極めて重要です。これがない DELETE 文は、非常に危険な「諸刃の剣」となります。実際の開発現場では、セーフティネットを確保するために、DELETE 操作はほぼ常にトランザクション (Transaction) の中で実行されます。
トランザクションを使用すると、複数の SQL ステートメントを一つの不可分な作業単位としてまとめることができます。トランザクション内のステートメントが一つでも失敗した場合、あるいは変更を取り消したいと判断した場合には、ROLLBACK(ロールバック)を実行してすべての操作を撤回できます。すべてが計画通りに進んだ場合は、COMMIT(コミット)を実行して変更を永久に確定させます。
以下は、トランザクションでラップされた DELETE 操作の典型的な例です。
START TRANSACTION; -- トランザクションを開始
-- 削除しようとしている行を確認(オプションだが強く推奨)
SELECT *
FROM products
WHERE category = 'Home Decor';
-- DELETE 操作を実行
DELETE FROM products
WHERE category = 'Home Decor';
-- 影響を受けた行数を確認(検証用)
-- SELECT ROW_COUNT();
-- 内容に間違いがないことを確信できたら、変更を確定:
-- COMMIT;
-- もし誤って削除したことに気づき、変更を取り消したい場合は、以下のコメントを解除:
-- ROLLBACK;DELETE 文を START TRANSACTION; の直後に配置し、すぐに COMMIT しないようにすることで、SELECT の結果を確認し、削除を実行した後、その結果が期待通りかどうかに基づいて COMMIT か ROLLBACK かを決定する余裕が生まれます。これは破壊的な操作を実行する際のベストプラクティスです。
5. DELETE と外部キー制約
テーブルからレコードを削除する際、外部キー制約 (Foreign Key Constraints) に注意する必要があります。削除しようとしている行が別のテーブルの外部キーによって参照されている場合、MySQL の挙動はその外部キーに対して定義された ON DELETE アクションルールに依存します。
- RESTRICT(デフォルト): 一致する子レコードが存在する場合、親レコードの削除をブロックします。エラーが発生します。
- NO ACTION: RESTRICT と同様です。子レコードが存在する場合、削除を阻止します。
- CASCADE(カスケード): 親レコードを削除すると同時に、それを参照しているすべての子レコードも自動的に削除します。連鎖的な影響が広範囲に及ぶ可能性があるため、使用には細心の注意を払ってください。
- SET NULL: 親レコードを削除し、子レコード内の外部キーカラムを NULL に設定します。これは子テーブルの外部キーカラムが NULL を許容している場合にのみ有効です。
例えば、orders(注文)テーブルが products(製品)テーブルを参照している場合(orders.product_id が products.product_id を参照する外部キー)、すでに注文が存在する製品を削除しようとし、外部キー設定が ON DELETE RESTRICT であれば、DELETE ステートメントは失敗します。
-- 注文テーブルが存在し、その product_id が製品テーブルの product_id を参照(ON DELETE RESTRICT)していると仮定
-- さらに product_id 1 の製品に関連する注文が存在する場合
DELETE FROM products
WHERE product_id = 1;
-- これは通常、以下のようなエラーを引き起こします:
-- ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`your_database`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`product_id`) REFERENCES `products` (`product_id`))これらの ON DELETE アクションルールを理解することは、データの整合性を維持し、関連テーブル間にわたる DELETE 操作の影響を予測するために不可欠です。