DELETE
| 対応: | SQL-92(1992) |
|---|
テーブルから行を削除するSQL文です。WHERE句で削除対象を絞り込まないと全行が削除されるため、実行前に必ず確認が必要です。
構文
条件に一致する行を削除します。
DELETE FROM テーブル名 WHERE 条件;
テーブルの全行を削除します(WHERE省略)。
DELETE FROM テーブル名;
構文一覧
| 構文 | 概要 |
|---|---|
| DELETE FROM テーブル名 WHERE 条件 | 条件に一致する行を削除します。削除した行数が返されます。 |
| DELETE FROM テーブル名 | テーブルの全行を削除します。WHEREを省略した場合の動作です。 |
| DELETE ... LIMIT 件数 | MySQLの拡張構文です。削除する最大行数を制限できます。 |
サンプルコード
以下の『employees』テーブルを例に説明します。
社員ID=5の社員を削除します。
sample_delete.sql
DELETE FROM employees WHERE id = 5;
Query OK, 1 row affected (0.01 sec)
削除結果を確認します。
sample_delete.sql
SELECT * FROM employees;
+----+------------+------------+-------------+ | id | name | department | retire_date | +----+------------+------------+-------------+ | 3 | 綾波レイ | NERV | NULL | | 4 | 碇シンジ | NERV | 2023-03-31 | | 6 | 葛城ミサト | NERV | NULL | +----+------------+------------+-------------+ 3 rows in set
退職日が設定済みの社員をすべて削除します(元のテーブルに対して実行した場合)。
sample_delete.sql
DELETE FROM employees WHERE retire_date IS NOT NULL;
Query OK, 2 rows affected (0.02 sec)
削除結果を確認します。退職日が設定されていた碇シンジ・惣流アスカが削除されています。
sample_delete.sql
SELECT * FROM employees;
+----+------------+------------+-------------+ | id | name | department | retire_date | +----+------------+------------+-------------+ | 3 | 綾波レイ | NERV | NULL | | 6 | 葛城ミサト | NERV | NULL | +----+------------+------------+-------------+ 2 rows in set
部署が「NERV」の社員をすべて削除します(元のテーブルに対して実行した場合)。
sample_delete.sql
DELETE FROM employees WHERE department = 'NERV';
Query OK, 4 rows affected (0.02 sec)
削除前に対象件数を確認します(安全な手順)。元のテーブルには退職日が設定された社員が2名います。件数を確認してからDELETEを実行します。
sample_delete.sql
SELECT COUNT(*) FROM employees WHERE retire_date IS NOT NULL;
+----------+ | COUNT(*) | +----------+ | 2 | +----------+ 1 row in set
sample_delete.sql
DELETE FROM employees WHERE retire_date IS NOT NULL;
Query OK, 2 rows affected (0.02 sec)
データベース別の書き方
『DELETE FROM ... WHERE』の基本構文は主要なデータベースで共通して使用できます。
DELETE FROM employees WHERE retire_date IS NOT NULL;
『DELETE ... LIMIT』で削除件数を制限できるのは MySQL のみです。PostgreSQL は『DELETE ... RETURNING』で削除した行のデータを取得できます。削除内容の確認やログ記録に便利です。
-- MySQL(削除件数を制限) DELETE FROM employees WHERE retire_date IS NOT NULL LIMIT 100; -- PostgreSQL(削除した行を返す) DELETE FROM employees WHERE retire_date IS NOT NULL RETURNING id, name;
概要
『DELETE』は行を削除しますが、テーブル自体やその構造(列定義・インデックスなど)は残ります。また、削除した行はトランザクション内であれば『ROLLBACK』で元に戻すことができます。
『WHERE』句を省略すると全行が削除されます。必ず実行前に『SELECT COUNT(*)』などで対象件数を確認してください。本番環境での操作はトランザクション内で実行することを強く推奨します。
テーブルの全行を削除する場合は、ログを残さず高速に処理できる『TRUNCATE』の使用も検討してください。ただし、TRUNCATEはトランザクションで保護できない点に注意が必要です。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。