CodeGym /コース /SQL SELF /データ削除のための DELETE の使い方

データ削除のための DELETE の使い方

SQL SELF
レベル 21 , レッスン 3
使用可能

削除って、ただの機能じゃなくて、アートなんだよ!必要なものだけ消して、余計なものは絶対消さないことが大事(うっかり消したデータは、夜中に夢に出てくるかも…)。今日は、ちゃんとルールを守って、丁寧に削除する方法をマスターしよう!

データ削除は、テーブルからビジネスロジックやシステム要件に合わなくなった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;

DELETETRUNCATE の違い:

  • 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 テーブルからその学生を削除させてくれない。

この問題を解決するには:

  1. 外部キー作成時に ON DELETE CASCADE を使ってカスケード削除を設定する。
  2. メインテーブルから削除する前に、関連レコードを手動で削除する。

関連データを手動で削除する例:

-- まず、学生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

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION