削除って、ただの機能じゃなくて、アートなんだよ!必要なものだけ消して、余計なものは絶対消さないことが大事(うっかり消したデータは、夜中に夢に出てくるかも…)。今日は、ちゃんとルールを守って、丁寧に削除する方法をマスターしよう!
データ削除は、テーブルからビジネスロジックやシステム要件に合わなくなった1行または複数行を除外するプロセスだよ。例えば、卒業した学生や、うーん、大学のルールを大きく破った学生のレコードを消したいときとか。あるいは、テーブルのデータを整理して、最新の情報だけ残したいときにも使うよ。
データ削除の操作は、こんなシーンで使うよ:
- もうアクティブじゃないユーザーのデータを消すとき。
- 一時的なレコードをテーブルからクリアしたいとき。
- 重複データを削除したいとき。
- 特定のビジネスロジックに従って古いレコードを消すとき。
DELETE コマンドのシンタックス
データを削除するには DELETE コマンドを使うよ。基本のシンタックスはこんな感じ:
DELETE FROM テーブル
WHERE 条件;
主なパーツ:
DELETE FROM— どのテーブルから行を削除するか指定するキーワード。- テーブル — データを削除したいテーブル名。
WHERE 条件— 削除したい行を絞り込む条件。ここには比較演算子や論理演算子(AND,OR,NOT)やサブクエリも使えるよ。
例:students テーブルがあって、ID = 5 の学生を削除したい場合:
DELETE FROM students
WHERE id = 5;
このクエリは、students テーブルの中で、学生ID(id カラム)が 5 の行を削除するよ。
注意: もし WHERE 条件を指定し忘れると、PostgreSQL はテーブルの 全行 を削除しちゃう。これは特に本番環境だとマジでヤバいミスになるから気をつけて!
テーブルの全行を削除する
もしテーブルの全行を削除したいなら、WHERE なしでクエリを書けばOK。例えば:
DELETE FROM students;
このクエリは 全レコード を students テーブルから削除するよ。でもテーブルの構造自体はそのまま残るから、空っぽになるだけ。
オルタナティブ:TRUNCATE
全行削除には TRUNCATE コマンドも使える。これは DELETE より速いんだ、なぜなら1行ずつ削除をトランザクションログに記録しないから。例:
TRUNCATE TABLE students;
DELETE と TRUNCATE の違い:
DELETEは、各削除をトランザクションログに記録するから、必要ならロールバックできる。TRUNCATEは条件(WHERE)をサポートしないし、1行ずつ記録もしない。だから速いけど柔軟性は低い。
テーブルをまるごとクリアしたいだけなら TRUNCATE が便利。でも一部だけ消したいとか、変更をロールバックしたいなら DELETE の方がいいよ。
複雑な条件でのデータ削除
DELETE の条件はシンプルなものだけじゃなくて、論理演算子(AND, OR, NOT)やサブクエリを使った複雑なものもOK。例を見てみよう。
例1:複数レコードの削除 30歳以上で、過去3ヶ月授業に来てない学生を全部削除する:
DELETE FROM students
WHERE age > 30 AND last_attendance_date < (CURRENT_DATE - INTERVAL '3 months');
このクエリは、両方の条件を満たす学生だけを削除するよ。
例2:サブクエリを使った削除
例えば、failed_students という、学業不振で除籍された学生のIDを保存しているテーブルがあるとする。その学生たちをメインの students テーブルから削除したい場合:
DELETE FROM students
WHERE id IN (SELECT student_id FROM failed_students);
ここではサブクエリが failed_students テーブルから学生IDを全部返して、DELETE が該当する行を students テーブルから削除するよ。
おすすめ
何かを削除する前に、まず SELECT で消したいデータを表示してみて。その後、SELECT の部分を DELETE に変えれば、さっき表示した行だけを削除できるよ。
実践例
例えば、ID = 7 の学生が大学を変えることにしたとする。その学生のデータを全部削除しよう:
DELETE FROM students
WHERE id = 7;
コマンド実行後、ちゃんと削除されたかテーブルを確認してみて:
SELECT * FROM students WHERE id = 7;
ID = 7 のレコードがなければ、削除成功だよ。
注意点とよくあるミス
WHERE セクションの書き忘れ
DELETE を使うとき、WHERE セクションを書き忘れるのが一番ありがちなミス。これをやるとテーブルの 全行 が消えちゃうから、本当に大惨事になる。クエリを実行する前に必ずチェックしよう。
うっかりミスの例:
DELETE FROM students;
-- ミス!全学生が削除される。
こういうミスを防ぐには、DELETE コマンドを実行する前に、必ず WHERE 条件を SELECT でテストするのがおすすめ。例えば:
SELECT * FROM students WHERE id = 5;
出力がOKなら、安心して DELETE を実行しよう。
関連データの削除
テーブルに外部キー(FOREIGN KEY)がある場合、データ削除時にエラーが出ることがあるよ。これは、削除しようとしている行が他のレコードと関連している場合に起こる。例えば、学生が enrollments テーブルでコースに登録されていると、PostgreSQL は students テーブルからその学生を削除させてくれない。
この問題を解決するには:
- 外部キー作成時に
ON DELETE CASCADEを使ってカスケード削除を設定する。 - メインテーブルから削除する前に、関連レコードを手動で削除する。
関連データを手動で削除する例:
-- まず、学生5のenrollmentsテーブルのデータを削除
DELETE FROM enrollments
WHERE student_id = 5;
-- その後、学生5自身を削除
DELETE FROM students
WHERE id = 5;
トランザクションでの削除
重要な削除操作にはトランザクションを使うのがオススメ。これで、もしミスっても変更をロールバックできるよ。
トランザクションで削除する例:
BEGIN;
DELETE FROM students
WHERE id = 42;
-- 結果を確認
SELECT * FROM students WHERE id = 42;
-- 問題なければコミット
COMMIT;
-- ダメならロールバック
-- ROLLBACK;
トランザクションについては、また次のレクチャーで詳しくやるね :P
GO TO FULL VERSION