CodeGym /課程 /SQL SELF /用 DROP TABLE 刪除資料表

用 DROP TABLE 刪除資料表

SQL SELF
等級 18, 課堂 2
開放

現在來聊聊怎麼正確用 DROP TABLE 指令把資料表從資料庫裡刪掉。

DROP TABLE 這個指令會把資料表連同裡面的資料和結構一起砍掉。想像一下你寫完畢業專題,結果不小心連筆電一起燒掉了。這就很像用 DROP TABLE。是不是有點可怕?別怕啦,最重要的是搞懂它怎麼運作,然後小心點用就好!

DROP TABLE 的特點:

  • 會把 整個資料表(還有裡面的資料)直接刪掉,沒備份就救不回來。
  • 完全釋放資料表在硬碟上佔的空間。
  • 連帶把所有相關的 index、constraint、trigger 也一起砍掉。

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 這個表就會從資料庫裡消失,裡面所有學生的資料也都沒了(如果有的話)。

一次刪多個資料表

你也可以一次砍掉好幾個表,只要用逗號分開就行:

DROP TABLE table1, table2, table3;

舉例:

DROP TABLE students, teachers, courses;

這行會直接把 students、teachers、courses 這三個表一起刪掉。

用 IF EXISTS

如果你試著刪 不存在的資料表,DROP TABLE 會報錯。為了避免這種錯誤,可以加上 IF EXISTS:

DROP TABLE IF EXISTS table_name;

舉例:

DROP TABLE IF EXISTS students;

如果 students 這個表存在就會被刪掉,不存在的話也不會報錯,只會給個警告。

考慮依賴關係刪資料表

有時候刪資料表會遇到困難,因為其他表或物件會依賴它。比如說有外鍵連到這個表。外鍵的細節我下個 level 再講 :P

假設你有兩個表:students 跟 enrollments。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:  constraint enrollments_student_id_fkey 在表 enrollments 上依賴資料表 students

要連同所有依賴物件一起刪,就要加 CASCADE:

DROP TABLE students CASCADE;

這行會把 students 跟所有依賴它的物件(這裡就是 enrollments)一起砍掉。

但用 CASCADE 要小心,因為它可能會刪掉比你想像中更多的東西。想知道會刪掉哪些東西,可以用 CASCADE 然後去看 log :)

不刪依賴物件的刪表方式

如果你想避免不小心把相關物件也刪掉,可以用 RESTRICT。這個選項會禁止刪掉有依賴物件的資料表:

DROP TABLE students RESTRICT;

如果這個表有依賴物件,指令會報錯,刪除動作會被取消。

臨時資料表跟它們的刪除

臨時資料表(用 CREATE TEMP TABLE 建的)在資料庫 session 結束時會自動刪掉。不過你也可以在 session 裡手動用 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。 這可能會把很重要的東西一起砍掉。用 CASCADE 前一定要搞清楚會影響到哪些物件。

不小心刪錯表。 在 production 資料庫操作前一定要再三確認你要刪的是哪個表。

一些有用又有點認真的建議

建議 1:全部否認

刪痕跡要比刪資料快。
然後很有自信地說:「這只是 log 裡的異常啦,我已經修好了」。

裝作這是 feature。
「我們在做 resilience stress test 啦…嗯,系統沒撐住。不過現在知道要改哪裡了!」

宣布撤離:「我們有 production 級別的 incident」。
大家都在跑來跑去的時候,沒人會問到底是誰按了 DELETE FROM 沒加 WHERE。

把履歷在 hh.ru 上更新成 DBA。
你現在真的更接近資料庫了,尤其是那些已經不存在的。

預先安排 coffee break。
因為過幾分鐘可能就有人叫你「休息一下…永遠的那種」。

裝作這是 staging。
「你確定那不是測試環境嗎?我們不是在測什麼嗎…大概啦…」

坐在 open space 正中央。
沒人會相信兇手敢坐這麼明目張膽的位置。

怪 ChatGPT。
都是 AI 的錯啦。你看它還沒準備好取代你。拜託不要 fire 我。

建議 2:怎麼帶著黑歷史找工作

  • 一次把所有表都刪掉。這樣老闆會太忙,沒空一個個 fire。

  • 沒人會單獨扛責任。如果你拉上主管一起走——就沒人會給你壞推薦信了。

  • 連客戶資料都刪了?恭喜,公司現在有比 fire 你更大的麻煩。

建議 3:刪表前一定要備份

這裡開始——不開玩笑。

在刪資料表前(尤其是重要資料),一定要用 pg_dump 先備份。這樣萬一不小心砍錯還救得回來。

備份指令範例:

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

到這裡你已經學會 DROP TABLE 的基本用法了。這顆「核彈按鈕」要收好,只有真的很確定才按。下堂課我們會繼續學怎麼改資料表和其他資料庫物件的結構。

2
任務
SQL SELF, 等級 18, 課堂 2
上鎖
刪除已存在的資料表
刪除已存在的資料表
2
任務
SQL SELF, 等級 18, 課堂 2
上鎖
刪除資料表並檢查其是否存在
刪除資料表並檢查其是否存在
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION