CodeGym /コース /SQL SELF /テーブル削除のやり方 DROP TABLE を使ってみよう

テーブル削除のやり方 DROP TABLE を使ってみよう

SQL SELF
レベル 18 , レッスン 2
使用可能

じゃあ、DROP TABLE コマンドでデータベースからテーブルを正しく削除する方法について話そう。

DROP TABLE は、テーブルのデータも構造もまるごとデータベースから消しちゃうコマンドだよ。例えば、卒業論文を書いて、うっかりノートPCごと燃やしちゃった感じ。これが DROP TABLE の威力。怖い?大丈夫、ちゃんと仕組みを理解して慎重に使えばOK!

DROP TABLE の特徴:

  • テーブル全体(データも含めて)を復元できない形で削除する(バックアップしてなければね)。
  • テーブルが使ってたディスク領域も完全に解放される。
  • 関連するインデックス、制約、トリガーも全部消える。

DROP TABLE コマンドのシンタックス

DROP TABLE のシンタックスはめっちゃシンプル:

DROP TABLE テーブル名;

ここで:

  • テーブル名 — 削除したいテーブルの名前。

テーブル削除のシンプルな例

例を見てみよう。例えば students というテーブルがあるとする:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INTEGER CHECK (age > 0)
);

このテーブルがもういらないなら、次のコマンドで削除できる:

DROP TABLE students;

このコマンドを実行すると、students テーブルはデータベースから完全に消えるよ。中に入ってた学生データも全部消える。

複数テーブルの削除

1回のクエリで複数のテーブルも削除できる。カンマで区切って並べるだけ:

DROP TABLE table1, table2, table3;

例:

DROP TABLE students, teachers, courses;

このコマンドで studentsteacherscourses の3つのテーブルが一気に消える。

IF EXISTS の使い方

DROP TABLE存在しないテーブル を消そうとするとエラーになる。これを避けるには IF EXISTS オプションを使おう:

DROP TABLE IF EXISTS テーブル名;

例:

DROP TABLE IF EXISTS students;

students テーブルがあれば削除されるし、なければエラーなしで警告だけ出る。

依存関係を考慮したテーブル削除

他のテーブルやオブジェクトが依存してると、テーブル削除が難しくなることがある。例えば、外部キーで他のテーブルとつながってる場合とか。外部キーについては次のレベルで詳しく話すね :P

例えば studentsenrollments という2つのテーブルがあるとする。enrollments テーブルは外部キーで students に依存してる。

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

CREATE TABLE enrollments (
    id SERIAL PRIMARY KEY,
    student_id INTEGER REFERENCES students(id), -- カラム student_id は students.id を参照
    course_name VARCHAR(100)
);

この状態で students テーブルを enrollments を消さずに削除しようとすると、こんなエラーが出る:

DROP TABLE students;
-- ERROR:  テーブル "students" を削除できません。他のオブジェクトが依存しています
-- DETAIL:  enrollments テーブルの enrollments_student_id_fkey 制約が students テーブルに依存しています

依存してるオブジェクトもまとめて消したいなら CASCADE オプションを使おう:

DROP TABLE students CASCADE;

このコマンドで students テーブルと、それに依存してるオブジェクト(この場合は enrollments テーブル)も自動的に削除される。

でも CASCADE の使いすぎには注意!思ったより多くのオブジェクトが消えることもあるから、何が消えるかログでちゃんと確認しよう :)

依存オブジェクトを消さずにテーブル削除を防ぐ

うっかり関連オブジェクトまで消しちゃうのを防ぎたいなら RESTRICT オプションを使おう。このオプションは、他に依存してるオブジェクトがあるとテーブル削除を禁止してくれる:

DROP TABLE students RESTRICT;

依存オブジェクトがある場合はエラーになって削除がキャンセルされる。

一時テーブルとその削除

一時テーブル(CREATE TEMP TABLE で作るやつ)は、データベースセッションが終わると自動的に消える。でも、セッション中に手動で DROP TABLE で消すこともできるよ。

例:

CREATE TEMP TABLE temp_data (
    id SERIAL PRIMARY KEY,
    value TEXT
);

DROP TABLE temp_data;

DROP TABLE でよくあるミス

存在しないテーブルを消そうとする。 エラーを避けるには IF EXISTS を使おう。

DROP TABLE IF EXISTS non_existing_table;

依存関係があるのに CASCADE を使わずに削除しようとする。 他のテーブルが依存してるとエラーになる。全部消していいなら CASCADE を使おう。

DROP TABLE students CASCADE;

CASCADE の使いすぎ。 重要なオブジェクトまで消えることがあるから、何が消えるかちゃんと理解してから使おう。

うっかりテーブルを消しちゃう。 特に本番データベースでは、何を消すか2回は確認しよう。

ちょっと真面目な便利アドバイス

便利アドバイス1:全部否定しよう

データより先に証拠を消そう。
そして自信満々に「ログの異常でした。もう直しました」と言おう。

それが仕様だと言い張ろう。
「耐障害性のストレステストをやってみたんです…で、システムが落ちました。でも改善点が分かりました!」

「プロダクションレベルのインシデントです」と避難を宣言しよう。
みんながパニックになってる間は、誰も DELETE FROMWHERE なしで実行した犯人を追及できない。

hh.ru で DBA 名義の履歴書を更新しよう。
これで本当にデータベースに近づいたね。特に、もう存在しないやつに。

コーヒーブレイクを事前に計画しよう。
数分後に「プロジェクトからしばらく休んで」って言われるかもだから。

ここは staging だったことにしよう。
「これテスト環境じゃなかったっけ?なんかテストしてた気がする…たぶん…」

オープンスペースのど真ん中に座ろう。
そんな堂々と座ってるやつが犯人なわけないって思われる。

ChatGPT のせいにしよう。
これ全部 AI のせい。まだ人間の代わりにはなれないって証明できた。クビにしないでね。

便利アドバイス2:やらかした後の転職活動

  • 全部のテーブルを一気に消そう。そうすれば上司も忙しすぎて誰をクビにするか決められない。

  • 一人で責任を取らない。上司も巻き込めば悪い評価はつかない。

  • 顧客データまで消した?おめでとう、会社は君のクビどころじゃない大問題を抱えることになる。

便利アドバイス3:削除前にバックアップしよう

ここからは冗談抜きで。

テーブルを削除する前(特に大事なデータが入ってる場合)は、pg_dump コマンドでバックアップを取ろう。うっかり消しても復元できるからね。

バックアップコマンドの例:

pg_dump -U username -d database_name -t table_name > table_backup.sql

これで DROP TABLE の基本はバッチリ!この「核ボタン」は本当に必要な時だけ使おう。次のレクチャーではテーブルや他のデータベースオブジェクトの構造変更について続けていくよ。

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