首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

資料庫約束機制全解析:確保資料完整性的關鍵

     編輯:關於SqlServer

什麼是資料庫約束?

資料庫約束是為了保證資料完整性而實現的一套機制。不同資料庫系統的具體實現工具雖有差異,但核心類型大同小異。本文以通用 SQL 標準為基礎,詳細解析五大核心約束類型及其應用場景。

五大核心約束類型

1. 檢查約束

透過在資料表定義中,於欄位層級或資料表層級加入條件限制,確保資料符合特定業務規則。

-- 欄位層級定義
CREATE TABLE student (
    id SERIAL,
    name VARCHAR(10),
    score INTEGER CHECK (score > 0)
);

-- 資料表層級定義(可跨欄位)
CREATE TABLE example (
    col1 INT,
    col2 INT,
    CHECK (col1 > col2)
);

2. 非空約束

強制欄位不得為 NULL,直接在欄位定義後加上 NOT NULL。

CREATE TABLE employee (
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL
);

3. 唯一約束

確保欄位值唯一(不包含 NULL 值),在欄位定義後加入 UNIQUE。

CREATE TABLE users (
    email VARCHAR(100) UNIQUE
);

4. 主鍵約束

SQL-92 標準建議建表時定義主鍵,其本質為 唯一約束 + 非空約束 的組合。

CREATE TABLE products (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(100)
);

5. 外鍵約束—— 關聯完整性的守護者

外鍵建立資料表間的參考關係,是維護關聯資料完整性的核心機制。

經典場景:學生-課程-成績三表關聯

-- 學生表
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)
);

外鍵的預設行為

  • 嘗試插入不存在的學生或課程 ID → 被拒絕
  • 嘗試刪除已有成績記錄的學生 → 被拒絕

進階控制:CASCADE 與 RESTRICT

透過 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:若子表有關聯記錄,禁止刪除父表記錄(預設行為)

最佳實踐建議

  1. 業務規則下沉: 將資料驗證邏輯盡可能放在資料庫層面,而非僅依賴應用程式
  2. 命名慣例: 為約束起有意義的名稱(如 FK_score_student),利於維護
  3. 效能考量: 適度使用外鍵,高併發寫入場景需評估鎖競爭影響
  4. 文件化: 在資料字典中記錄所有約束的業務含義

掌握並善用這五大約束類型,是建構健壯、可靠資料庫系統的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved