資料可以很多,但不是每一筆都很有用。為了不讓資料表變成垃圾場,PostgreSQL 讓你可以加上一些限制。這就像簡單的規則,讓大家不能在「名字」欄位填數字,或是直接空著不填。
什麼是 constraints?
限制(constraints) 在 PostgreSQL 裡就像軍隊裡的規矩。如果沒有這些規則,大家想幹嘛就幹嘛:可以把使用者年齡設成 -999,名字欄位放空字串,或是同一個學生用不同 id 重複加進來。為了避免這種狀況,PostgreSQL 提供了叫做限制的控制機制。
限制可以讓你:
- 讓你的資料保持正確又一致。
- 確保資料符合某些規則(像是年齡不能是負數)。
- 如果資料怪怪的,可以更快找到錯誤。
今天我們要看兩個最常用的限制:NOT NULL 跟 UNIQUE。
NOT NULL 限制
NOT NULL 限制就是跟 PostgreSQL 說:「欸,這個欄位一定要有值,不能空著!」如果你想要加一筆資料,結果這個欄位是 NULL,PostgreSQL 會直接報錯。這對於像名字或生日這種一定要填的欄位超有用。
NOT NULL 的範例
CREATE TABLE teachers (
id SERIAL PRIMARY KEY, -- 唯一識別碼
name VARCHAR(100) NOT NULL, -- 老師名字(必填)
subject VARCHAR(50) NOT NULL -- 他教的科目(必填)
);
在這個例子裡,name 跟 subject 欄位都不能空著。如果你試著加一筆資料但沒填這兩個欄位,就會出錯。
INSERT INTO teachers (name, subject)
VALUES (NULL, 'Mathematics');
結果:錯誤!你沒填老師名字,而 name 一定要有值。
UNIQUE 限制:要獨一無二
UNIQUE 限制保證某個欄位或一組欄位的值不會重複。如果你想確保兩個學生不能有一樣的學號,這就超好用。
如果說 NOT NULL 是「所有來賓都要穿衣服」,那 UNIQUE 就是「派對上不能有人穿一樣的衣服」。
UNIQUE 的範例
CREATE TABLE departments (
id SERIAL PRIMARY KEY, -- 唯一識別碼
name VARCHAR(100) UNIQUE -- 部門名稱要獨一無二
);
現在你不能加兩個一樣名字的部門了。
INSERT INTO departments (name) VALUES ('Mathematics');
INSERT INTO departments (name) VALUES ('Mathematics');
結果:錯誤!你試著在 name 欄位加重複的值。
組合 UNIQUE 限制
你也可以讓兩個(或更多)欄位的組合要獨一無二。像這樣:
CREATE TABLE enrollments (
id SERIAL PRIMARY KEY, -- 這筆紀錄的唯一識別碼
student_id INTEGER NOT NULL, -- 學生識別碼
course_id INTEGER NOT NULL, -- 課程識別碼
UNIQUE (student_id, course_id) -- 一個學生不能重複選同一門課
);
現在每一組 student_id 跟 course_id 都要獨一無二。如果有人想讓同一個學生重複選同一門課,PostgreSQL 會擋下來。
限制可以一起用:NOT NULL 跟 UNIQUE
你可以在同一個欄位同時加 NOT NULL 跟 UNIQUE。像這樣:
CREATE TABLE users (
username VARCHAR(50) NOT NULL UNIQUE, -- 登入名稱要獨一無二,也必填
email VARCHAR(100) NOT NULL UNIQUE -- 電子郵件要獨一無二,也必填
);
這裡登入名稱跟電子郵件都不能重複,也不能空著。
用限制時常見的錯誤
如果你只在欄位加 UNIQUE,但沒加 NOT NULL,那你可以加好幾筆 NULL 的資料,因為 PostgreSQL 覺得 NULL 跟另一個 NULL 不一樣。如果你想禁止空值,記得加 NOT NULL。
如果你在有 UNIQUE 限制的欄位加重複的值,會直接報錯。記得在 INSERT 前先檢查資料。
限制加太多會讓新增資料變慢。
為什麼要這樣做?
用限制可以避免很多麻煩,像是資料重複、空值或其他人為錯誤。這會讓你的資料庫「自我保護」,而且專案規模大時超省事。面試時也常常會問到限制,所以懂 NOT NULL 跟 UNIQUE 不只很實用,還能讓面試官對你印象深刻。
下次講座我們會聊 DEFAULT 限制,讓你可以設定欄位的預設值,如果使用者沒填就用這個。下次見囉!
GO TO FULL VERSION