資料庫約束是為了保證資料完整性而實現的一套機制。不同資料庫系統的具體實現工具雖有差異,但核心類型大同小異。本文以通用 SQL 標準為基礎,詳細解析五大核心約束類型及其應用場景。
透過在資料表定義中,於欄位層級或資料表層級加入條件限制,確保資料符合特定業務規則。
-- 欄位層級定義
CREATE TABLE student (
id SERIAL,
name VARCHAR(10),
score INTEGER CHECK (score > 0)
);
-- 資料表層級定義(可跨欄位)
CREATE TABLE example (
col1 INT,
col2 INT,
CHECK (col1 > col2)
);
強制欄位不得為 NULL,直接在欄位定義後加上 NOT NULL。
CREATE TABLE employee (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
確保欄位值唯一(不包含 NULL 值),在欄位定義後加入 UNIQUE。
CREATE TABLE users (
email VARCHAR(100) UNIQUE
);
SQL-92 標準建議建表時定義主鍵,其本質為 唯一約束 + 非空約束 的組合。
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(100)
);
外鍵建立資料表間的參考關係,是維護關聯資料完整性的核心機制。
-- 學生表
CREATE TABLE student (
id SERIAL PRIMARY KEY,
name VARCHAR(10)
);
-- 課程表
CREATE TABLE class (
class_id VARCHAR(5) PRIMARY KEY,
describe VARCHAR(20)
);
-- 成績表(含外鍵)
CREATE TABLE score (
id INTEGER REFERENCES student,
class_id VARCHAR(5) REFERENCES class,
score INTEGER CHECK (score > 0)
);
透過 ON UPDATE 和 ON DELETE 子句,可精確控制級聯行為:
CREATE TABLE score (
id INTEGER REFERENCES student
ON UPDATE CASCADE
ON DELETE CASCADE,
class_id VARCHAR(5) REFERENCES class
ON UPDATE CASCADE
ON DELETE RESTRICT,
score INTEGER CHECK (score > 0)
);
說明:
ON UPDATE CASCADE:父表鍵值更新時,子表自動同步更新ON DELETE CASCADE:刪除父表記錄時,級聯刪除子表對應記錄ON DELETE RESTRICT:若子表有關聯記錄,禁止刪除父表記錄(預設行為)FK_score_student),利於維護掌握並善用這五大約束類型,是建構健壯、可靠資料庫系統的基石。