有時候我們真的不想每個欄位都自己填——懶啦,或是根本沒資料。這時候就可以先設定好預設值,讓資料庫自己幫你補上去,超方便。
插入資料到資料表
預設值 跟插入資料超有關係。所以我先簡單講一下,之後還會再深入聊這個主題,保證你學到會。
要加資料進資料表超簡單——有個專門的指令叫 INSERT INTO。INSERT 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 | |
|---|---|---|
| 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 | |
|---|---|---|
| 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;
搞混 DEFAULT 跟 NOT NULL。 預設值不代表這個欄位一定要有值(NOT NULL)。沒特別加 NOT NULL,這個欄位還是可以是 NULL。
GO TO FULL VERSION