想像一下,你正在幫大學設計資料庫。一開始,學生的資料表只有兩個欄位:ID 跟名字。超簡單,學生們開始用這個系統。結果一個月後,老師們跑來說:「可以再加個年齡嗎?」過沒多久又說:「還要 email!」然後又說:「那個 middle_name 欄位乾脆刪掉吧,反正沒人在填!」這時候你就會用到 ALTER TABLE 來加欄位或刪欄位的技能啦。
新增欄位的語法
所以,要在 PostgreSQL 的現有資料表加新欄位,就是用 ALTER TABLE 指令。來看語法:
ALTER TABLE table_name
ADD COLUMN column_name data_type [constraints];
table_name— 你想加新欄位的資料表名稱。column_name— 你要加的欄位名稱。data_type— 資料型態,比如VARCHAR、INTEGER或DATE。constraints(可選參數)— 你想對這個欄位加的限制,比如NOT NULL、DEFAULT等等。
範例:新增一個欄位
假設我們有一個之前建立好的 students 資料表:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
突然有需求要加一個 age 欄位來存學生年齡。這樣做:
ALTER TABLE students
ADD COLUMN age INTEGER;
現在 students 資料表的結構會變成這樣:
| id | name | age |
|---|---|---|
| 1 | Eva | NULL |
| 2 | Alex | NULL |
如果你新增資料時沒填年齡,PostgreSQL 會自動給 NULL,因為我們沒加 NOT NULL 或 DEFAULT 這種限制。
刪除欄位的語法
要從資料表刪掉欄位也是用 ALTER TABLE。語法如下:
ALTER TABLE table_name
DROP COLUMN column_name [RESTRICT | CASCADE];
table_name— 你想刪除欄位的資料表名稱。column_name— 你要刪掉的欄位名稱。RESTRICT— 如果有其他東西參考這個欄位就不讓你刪(預設)。CASCADE— 連同所有相關的依賴一起刪掉。
關於依賴的連鎖刪除我會在下一個等級再細講 :P
範例:刪掉不需要的欄位
回到 students 資料表。我們決定 age 欄位不需要了。來刪掉它:
ALTER TABLE students
DROP COLUMN age;
現在資料表結構又變簡單了:
| id | name |
|---|---|
| 1 | Eva |
| 2 | Alex |
實用範例
新增有 constraints 的欄位
如果你想加 age 欄位,但要加 NOT NULL 限制跟預設值?可以這樣寫:
ALTER TABLE students
ADD COLUMN age INTEGER NOT NULL DEFAULT 18;
這樣所有現有的資料列 age 欄位都會設成 18,以後新增資料時這個欄位一定要填(除非用預設值)。
刪除有依賴的欄位
如果某個欄位有依賴(像是被 view 或 trigger 用到),你就得用 CASCADE。但要小心:這可能會影響到資料庫裡的其他東西。例如:
ALTER TABLE students
DROP COLUMN email CASCADE;
常見錯誤與注意事項
錯誤:新增欄位時資料型態不對。
比如你加了一個 INTEGER 欄位,卻想存文字。PostgreSQL 會看不懂,新增資料時就會報錯。資料型態一定要跟內容對得起來。
錯誤:刪欄位沒考慮依賴。
比如你刪掉一個被 index 或 foreign key 參考的欄位,沒加 CASCADE,PostgreSQL 會報錯。
錯誤:刪除有依賴的欄位。 比如你刪掉一個被 index 或 foreign key 參考的欄位,沒加 CASCADE,PostgreSQL 會報錯。你加了 CASCADE,結果一堆本來不該刪的資料也跟著消失了 : (
注意:執行順序很重要。
有時候加欄位時如果有加限制,順序要注意。像你加 NOT NULL 欄位時,記得先給預設值,不然 PostgreSQL 會報錯。
GO TO FULL VERSION