SQL DELETE FROM WHERE — 安全な行の削除

DELETE FROM WHEREによるテーブルからの行の削除方法。カスケード削除、DELETE JOIN、TRUNCATE、安全なプラクティスを解説します。

DML Commands

詳細な説明

データの削除

DELETE文はテーブルから行を削除します。UPDATEと同様に、WHERE句を忘れるとすべての行が削除されます。

基本的な削除

DELETE FROM employees
WHERE id = 42;

サブクエリによる削除

DELETE FROM employees
WHERE department_id IN (
  SELECT id FROM departments WHERE is_archived = true
);

JOINを使った削除

PostgreSQLUSINGを使用:

DELETE FROM employees e
USING departments d
WHERE e.department_id = d.id
  AND d.name = 'Legacy'
RETURNING e.id, e.name;

MySQLJOINを使用:

DELETE e FROM employees e
JOIN departments d ON e.department_id = d.id
WHERE d.name = 'Legacy';

TRUNCATEとDELETEの比較

機能 DELETE TRUNCATE
WHERE句 あり なし(全行)
トリガー発火 あり なし
ROLLBACK可能 あり(トランザクション内) DBによる
速度 遅い(行ごと) 速い(ページレベル)
自動増分リセット なし あり(MySQL、PostgreSQL)
-- 全行を高速削除
TRUNCATE TABLE temp_imports;

カスケード削除

ON DELETE CASCADEで定義された外部キーがあるテーブルでは、親行を削除すると関連する子行も自動的に削除されます:

-- departmentsテーブルにON DELETE CASCADEがある場合
DELETE FROM departments WHERE id = 5;
-- 部署5のすべての従業員も削除される

安全チェックリスト

  1. まず同じWHEREでSELECTを実行してスコープを確認。
  2. トランザクションで囲む(BEGIN ... ROLLBACK / COMMIT)。
  3. 大量削除の場合はテーブルをバックアップ。

ユースケース

古いレコードや無効なレコードをテーブルからパージする必要がある場合。例えば、保持期間後にソフト削除されたユーザーを削除したり、一時的なインポートデータをクリーンアップする場合。

試してみる — SQL Cheat Sheet

フルツールを開く