CodeGym /課程 /SQL SELF /使用 DEFAULT 預設值

使用 DEFAULT 預設值

SQL SELF
等級 17 , 課堂 2
開放

有時候我們真的不想每個欄位都自己填——懶啦,或是根本沒資料。這時候就可以先設定好預設值,讓資料庫自己幫你補上去,超方便。

插入資料到資料表

預設值 跟插入資料超有關係。所以我先簡單講一下,之後還會再深入聊這個主題,保證你學到會。

要加資料進資料表超簡單——有個專門的指令叫 INSERT INTOINSERT INTO 是 SQL 的一個指令,可以 新增一筆資料到資料表。這個指令超常用,尤其是做網頁表單、紀錄 log、用戶註冊或更新資料時。

指令語法

INSERT INTO 資料表 (欄位1, 欄位2, ...)
VALUES (值1, 值2, ...);

說明:

  • 資料表 — 你要加資料進去的表名。
  • 欄位1, 欄位2, ... — 欄位名稱(如果你每個欄位都照順序給值,可以省略這一段)。
  • 值1, 值2, ... — 對應上面欄位的值。

簡單例子

INSERT INTO users (name, email)
VALUES ('Alice', 'alice@example.com');

這樣就會在 users 表裡加一筆資料:name 是 "Alice",email 是 "alice@example.com"。

結果:

id name email
1 Alice alice@example.com

一次插入多筆資料

你也可以 一次加好幾筆,這樣又快又省資源。

INSERT INTO users (name, email)
VALUES 
  ('Alice', 'alice@example.com'),
  ('Bob', 'bob@example.net'),
  ('Charlie', 'charlie@example.org'),
  ('Diana', 'diana@example.com'),
  ('Eve', 'eve@example.net');

結果會長這樣:

id name email
1 Alice alice@example.com
2 Bob bob@example.net
3 Charlie charlie@example.org
4 Diana diana@example.com
5 Eve eve@example.net

預設值

還記得剛剛插入資料的語法嗎?

INSERT INTO 資料表 (欄位1, 欄位2, ...)
VALUES (值1, 值2, ...);

你有沒有想過,為什麼要列出欄位:欄位1, 欄位2?不是只要照欄位順序給值就好?

其實很多 值都可以不用給。像是新資料的 ID,PostgreSQL 會自己算。也可以自動填現在的日期/時間。如果你沒給某些值,PostgreSQL 會自動補 NULL。

PostgreSQL 幫你做很多事,你也可以自己控制——這就是 預設值 的用處,用 DEFAULT 關鍵字設定。

預設值會在你沒給某個欄位值時自動補上。這不只省時間,還能避免漏掉重要資料的錯誤。

DEFAULT 怎麼用?

來看語法。預設值是在建立資料表時設定的。基本格式:

CREATE TABLE 資料表 (
    欄位 資料型別 DEFAULT 預設值
);

如果你要幫已經存在的表加預設值:

ALTER TABLE 資料表
ALTER COLUMN 欄位
SET DEFAULT 預設值;

怎麼改表格我之後還會再講,敬請期待 :P

例子 1:有 DEFAULT 欄位的資料表

來建立一個 students 表,每個學生會自動有註冊日期:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    registration_date DATE DEFAULT CURRENT_DATE
);

現在你加新學生時沒給 registration_date,PostgreSQL 會自動填今天的日期。

INSERT INTO students (name) VALUES ('Alex Lin');

查詢時:

SELECT * FROM students;

你會拿到這樣的結果:

id name registration_date
1 Alex Lin 2023-10-15

實用例子

數字欄位的預設值

假設我們有個 grades 表,grade 欄位如果還沒打分數就預設 0

CREATE TABLE grades (
    id SERIAL PRIMARY KEY,
    student_id INTEGER NOT NULL,
    course_id INTEGER NOT NULL,
    grade INTEGER DEFAULT 0
);

加一筆沒給 grade 的資料:

INSERT INTO grades (student_id, course_id) VALUES (1, 101);

表格會變這樣:

id student_id course_id grade
1 1 101 0

TEXT 預設值

想像有個 teachers 表,每個老師加進來時自動給個「未驗證」狀態。

CREATE TABLE teachers (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    status TEXT DEFAULT 'unverified'
);

加老師時沒給 status:

INSERT INTO teachers (name) VALUES ('Peter Pall');

結果會是:

id name status
1 Peter Pall unverified

時間欄位的預設值

有個 meetings 表,裡面有個 meeting_time 欄位,預設會是早上 10:00。

CREATE TABLE meetings (
    id SERIAL PRIMARY KEY,
    topic VARCHAR(100),
    meeting_time TIME DEFAULT '10:00'
);

加一筆資料:

INSERT INTO meetings (topic) VALUES ('專案討論');

結果:

id topic meeting_time
1 專案討論 10:00

DEFAULT 常見錯誤

預設值型別跟欄位型別不符。 你如果想在數字欄位放文字,PostgreSQL 會直接報錯:

CREATE TABLE example (
    number INTEGER DEFAULT 'text'
);

錯誤: invalid input syntax for type integer.

DEFAULT 但沒考慮舊資料。 你改了預設值,舊的資料不會跟著變——它們還是用舊的。要更新舊資料要用 UPDATE

UPDATE students SET registration_date = '2023-01-01' WHERE registration_date IS NULL;

搞混 DEFAULTNOT NULL 預設值不代表這個欄位一定要有值(NOT NULL)。沒特別加 NOT NULL,這個欄位還是可以是 NULL

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION