CodeGym /課程 /SQL SELF /ALTER TABLE 來改變資料表結構

ALTER TABLE 來改變資料表結構

SQL SELF
等級 17 , 課堂 4
開放

現在該來聊聊怎麼去改現有的資料表啦。在一個專案的生命週期裡,幾乎沒有東西是永遠不變的——需求可能會突然冒出來,像 bombaridilokrokodilo 一樣突襲你。比如說,product manager 突然決定每個使用者都要有一個獨一無二的最愛個人頁背景色 ID。或者你發現 VARCHAR(50) 根本不夠存名字,畢竟資料庫裡已經有個叫「Bombaridilokrokodilo-Junior-Third」的使用者了。

這時候,PostgreSQL 就有個超好用的工具——ALTER TABLE 指令。

ALTER TABLE 這個指令可以讓你 改變現有資料表的結構。你可以用它來:

  • 新增欄位;
  • 刪掉不需要的欄位;
  • 改欄位的資料型別;
  • 重新命名資料表或欄位;
  • 加或刪 constraint,像是 NOT NULLUNIQUE,還有很多其他的。

簡單說,這就像你已經蓋好一棟房子(資料表),但現在想加個新房間(欄位)或拆掉沒用的儲藏室(刪欄位)。

ALTER TABLE 的語法

這個指令的基本結構其實蠻直覺的:

ALTER TABLE 資料表
    修改動作;

這裡:

  • 資料表 —— 你想要修改的資料表名稱;
  • 修改動作 —— 你想做的事(比如加欄位、刪欄位或改資料型別)。

ALTER TABLE 的使用範例

新增欄位

如果你想在資料表裡加一個新欄位,就用 ADD COLUMN。像這樣:

ALTER TABLE students
ADD COLUMN email VARCHAR(100);

這個指令會在 students 資料表裡加一個新的 email 欄位,用來存學生的 email 地址。這個欄位的型別是最長 100 字的字串。

假設你已經建立了學生資料表,但忘了加入入學日期的資訊。這樣補救:

ALTER TABLE students
ADD COLUMN enrollment_date DATE;

現在你有了 enrollment_date 欄位,可以存入學日期啦。

刪除欄位

如果你覺得某個欄位沒用了,就用 DROP COLUMN。例如:

ALTER TABLE students
DROP COLUMN email;

這個指令會把 students 資料表裡的 email 欄位刪掉。注意,這個欄位裡的資料也會 直接消失,沒辦法救回來

重點提醒:

如果你想刪的欄位在其他資料表有被用到(比如是 foreign key),PostgreSQL 可能會報錯。這種情況下要先把依賴關係刪掉。

改欄位的資料型別

有時候一開始選的資料型別不太對。比如你本來想把學生年齡存成 SMALLINT,後來發現不夠用,想改成 BIGINT。這樣做:

ALTER TABLE students
ALTER COLUMN age TYPE BIGINT;

重點提醒: 如果欄位裡已經有資料,PostgreSQL 會檢查能不能轉型。如果不行,就會報錯。

假設你有個 description 欄位本來是 VARCHAR(100),但後來發現課程描述可能會很長。那就把型別改成 TEXT

ALTER TABLE courses
ALTER COLUMN description TYPE TEXT;

這樣你就可以存超長的課程描述,不用再擔心長度限制。

重新命名欄位

如果你想改欄位名稱,用 RENAME COLUMN

ALTER TABLE students
RENAME COLUMN name TO full_name;

現在 name 欄位就變成 full_name 了。

重新命名資料表

你也可以改資料表的名字。用 RENAME TO

ALTER TABLE students
RENAME TO university_students;

這樣 students 資料表就變成 university_students

設定/移除 NOT NULL constraint

假設你有個欄位,結果忘了設成必填(NOT NULL)。沒關係!你可以之後再加 constraint:

ALTER TABLE students
ALTER COLUMN name SET NOT NULL;

如果想移除 NOT NULL constraint,就用 DROP NOT NULL

ALTER TABLE students
ALTER COLUMN name DROP NOT NULL;

設定預設值

如果欄位已經存在,但你想給它設個預設值,用 SET DEFAULT

ALTER TABLE enrollments
ALTER COLUMN enrollment_date SET DEFAULT CURRENT_DATE;

要移除預設值就這樣:

ALTER TABLE enrollments
ALTER COLUMN enrollment_date DROP DEFAULT;

我們會在接下來三堂課更詳細地講每個指令,敬請期待 :)

ALTER TABLE 常見的錯誤

ALTER TABLE 的時候有時會遇到錯誤。這裡列幾個最常見的:

想改成跟現有資料不相容的資料型別。 比如 age 欄位已經有資料,你卻想把它轉成 VARCHAR 字串,這樣會報錯。解法:先把資料刪掉或轉型。

想刪掉被當作 foreign key 或 index 的欄位。 PostgreSQL 不會讓你這樣做,因為要保護資料完整性。要先把相關的 constraint 或關聯刪掉。

語法錯誤。 ALTER TABLE 很彈性,但語法要很精確。像 ADD COLUMN 就一定要指定資料型別。

實際應用場景

在現實開發裡,ALTER TABLE 幾乎天天都會用到。你可能會在這些情境遇到它:

  • 在現有資料表加新資料(比如新欄位);
  • 優化資料庫(比如改資料型別讓記憶體用更少);
  • 修正設計錯誤(比如一開始忘了加 constraint 或型別選錯)。

你現在應該懂 ALTER TABLE 有多強大了吧。這是一個超好用的工具,讓你能應付專案裡的各種變動。最重要的是——要小心慢慢來,不要一不小心「拆了房子」(你的資料表)只為了加個新房間。

1
問卷/小測驗
資料表建立基礎,等級 17,課堂 4
未開放
資料表建立基礎
資料表建立基礎
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION