CodeGym /課程 /SQL SELF /在資料表中新增與刪除欄位

在資料表中新增與刪除欄位

SQL SELF
等級 18, 課堂 0
開放

想像一下,你正在幫大學設計資料庫。一開始,學生的資料表只有兩個欄位: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 會報錯。

2
任務
SQL SELF, 等級 18, 課堂 0
上鎖
新增欄位
新增欄位
2
任務
SQL SELF, 等級 18, 課堂 0
上鎖
新增帶有約束的欄位
新增帶有約束的欄位
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION