現在該來聊聊怎麼去改現有的資料表啦。在一個專案的生命週期裡,幾乎沒有東西是永遠不變的——需求可能會突然冒出來,像 bombaridilokrokodilo 一樣突襲你。比如說,product manager 突然決定每個使用者都要有一個獨一無二的最愛個人頁背景色 ID。或者你發現 VARCHAR(50) 根本不夠存名字,畢竟資料庫裡已經有個叫「Bombaridilokrokodilo-Junior-Third」的使用者了。
這時候,PostgreSQL 就有個超好用的工具——ALTER TABLE 指令。
ALTER TABLE 這個指令可以讓你 改變現有資料表的結構。你可以用它來:
- 新增欄位;
- 刪掉不需要的欄位;
- 改欄位的資料型別;
- 重新命名資料表或欄位;
- 加或刪 constraint,像是
NOT NULL、UNIQUE,還有很多其他的。
簡單說,這就像你已經蓋好一棟房子(資料表),但現在想加個新房間(欄位)或拆掉沒用的儲藏室(刪欄位)。
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 有多強大了吧。這是一個超好用的工具,讓你能應付專案裡的各種變動。最重要的是——要小心慢慢來,不要一不小心「拆了房子」(你的資料表)只為了加個新房間。
GO TO FULL VERSION