CodeGym /課程 /SQL SELF /建立資料表時加上限制條件:NOT NULL、UNIQUE

建立資料表時加上限制條件:NOT NULL、UNIQUE

SQL SELF
等級 17 , 課堂 1
開放

資料可以很多,但不是每一筆都很有用。為了不讓資料表變成垃圾場,PostgreSQL 讓你可以加上一些限制。這就像簡單的規則,讓大家不能在「名字」欄位填數字,或是直接空著不填。

什麼是 constraints?

限制(constraints) 在 PostgreSQL 裡就像軍隊裡的規矩。如果沒有這些規則,大家想幹嘛就幹嘛:可以把使用者年齡設成 -999,名字欄位放空字串,或是同一個學生用不同 id 重複加進來。為了避免這種狀況,PostgreSQL 提供了叫做限制的控制機制。

限制可以讓你:

  1. 讓你的資料保持正確又一致。
  2. 確保資料符合某些規則(像是年齡不能是負數)。
  3. 如果資料怪怪的,可以更快找到錯誤。

今天我們要看兩個最常用的限制:NOT NULLUNIQUE

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    -- 他教的科目(必填)
);

在這個例子裡,namesubject 欄位都不能空著。如果你試著加一筆資料但沒填這兩個欄位,就會出錯。

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_idcourse_id 都要獨一無二。如果有人想讓同一個學生重複選同一門課,PostgreSQL 會擋下來。

限制可以一起用:NOT NULLUNIQUE

你可以在同一個欄位同時加 NOT NULLUNIQUE。像這樣:

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 NULLUNIQUE 不只很實用,還能讓面試官對你印象深刻。

下次講座我們會聊 DEFAULT 限制,讓你可以設定欄位的預設值,如果使用者沒填就用這個。下次見囉!

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