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を使った削除
PostgreSQLはUSINGを使用:
DELETE FROM employees e
USING departments d
WHERE e.department_id = d.id
AND d.name = 'Legacy'
RETURNING e.id, e.name;
MySQLはJOINを使用:
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のすべての従業員も削除される
安全チェックリスト
- まず同じWHEREで
SELECTを実行してスコープを確認。 - トランザクションで囲む(
BEGIN ... ROLLBACK / COMMIT)。 - 大量削除の場合はテーブルをバックアップ。
ユースケース
古いレコードや無効なレコードをテーブルからパージする必要がある場合。例えば、保持期間後にソフト削除されたユーザーを削除したり、一時的なインポートデータをクリーンアップする場合。