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

資料庫完整性約束全解析:實體、參考、域、使用者自訂四大支柱

     編輯:關於SqlServer

完整性約束 是資料庫防止髒資料、保證語義正確的最後防線。SQL 標準定義四大類:實體完整性、參考完整性、域完整性、使用者自訂完整性。本文逐一拆解定義、實作語法與實務場景。

1. 實體完整性 — 唯一識別每一列

規定:主鍵欄位 不得為 NULL,且值 唯一。確保每個實體可被精確區分。

實作方式

  • PRIMARY KEY (col) — 隱含 NOT NULL + UNIQUE
  • UNIQUE (col) — 允許單一 NULL (SQL Server)
  • IDENTITY / SEQUENCE — 自動產生唯一值

範例

CREATE TABLE Student (
    StudentID INT PRIMARY KEY,  -- 實體完整性:非空、唯一
    Name NVARCHAR(50) NOT NULL
);

複合主鍵 PRIMARY KEY (StudentID, CourseID) 時,兩欄皆不可為 NULL。

2. 參考完整性 — 關聯關係的守門員

規定:外鍵 (FK) 值必須**匹配**被參考表的主鍵 (PK) 值,或為 NULL (若允許)。防止「懸空參考」。

核心概念

術語說明
被參考表 (Referenced Table)擁有主鍵的父表 (如 Class)
參考表 (Referencing Table)擁有外鍵的子表 (如 Student)
外鍵 (Foreign Key)子表中對應父表主鍵的欄位 (如 ClassID)

刪除/更新規則 (ON DELETE / ON UPDATE)

動作行為適用場景
NO ACTION (預設)拒絕父表刪除/更新,拋錯嚴格業務,不可級聯
CASCADE級聯刪除/更新子表對應列訂單-明細、主從強綁定
SET NULL子表 FK 設為 NULL (需 FK 允許 NULL)員工-部門,員工保留但解除歸屬
SET DEFAULT子表 FK 設為預設值特定業務預設歸屬

範例

CREATE TABLE Class (
    ClassID INT PRIMARY KEY,
    ClassName NVARCHAR(50)
);

CREATE TABLE Student (
    StudentID INT PRIMARY KEY,
    Name NVARCHAR(50),
    ClassID INT,
    CONSTRAINT FK_Student_Class FOREIGN KEY (ClassID)
        REFERENCES Class(ClassID)
        ON DELETE SET NULL   -- 刪除班級時,學生班級設為 NULL
        ON UPDATE CASCADE    -- 班級 ID 變更時,學生自動同步
);

3. 域完整性 — 欄位值的合法邊界

規定:限制欄位的**資料型別、格式、取值範圍、是否允許 NULL**。

實作工具箱

  • 資料型別:INT, DECIMAL(10,2), DATE, NVARCHAR(100) 等
  • CHECK 約束:CHECK (Age >= 0 AND Age <= 150)
  • DEFAULT 約束:DEFAULT (GETDATE())、DEFAULT (0)
  • NOT NULL:強制必填
  • 規則 / 用戶定義型別 (舊版):現代建議用 CHECK + 型別

4. 使用者自訂完整性 — 業務語義的最後一道防線

定義:針對特定應用的**跨表、跨欄、複雜條件**約束,超越上述三類標準機制。

實作路徑

  1. CHECK 約束 (單表內):CHECK (EndDate >= StartDate)
  2. 觸發器 (跨表/複雜邏輯):
    CREATE TRIGGER trg_CheckInventory ON SalesOrder
    AFTER INSERT AS
    BEGIN
        IF EXISTS (SELECT 1 FROM inserted i JOIN Product p ON i.ProductID = p.ProductID
                   WHERE i.Qty > p.StockQty)
            THROW 50001, '庫存不足', 1;
    END;
  3. 應用層驗證:最彈性、效能最好 (避免資料庫往返),但需防繞過

四大完整性對比總表

類型保護對象核心機制典型場景
實體完整性列 (Tuple)PK, UNIQUE, IDENTITY唯一識別學生、訂單、商品
參考完整性表與表關聯FK, ON DELETE/UPDATE學生-班級、訂單-客戶、明細-主單
域完整性欄位值型別, CHECK, DEFAULT, NOT NULL年齡 0-150、薪資 > 0、郵件格式
使用者自訂業務規則觸發器, CHECK, 應用層庫存扣減、信用額度、複雜狀態機

最佳實務建議

  1. 儘可能下推至資料庫層:CHECK、FK、PK 由引擎強制,零繞過風險
  2. 複雜跨表規則用觸發器:但注意效能與遞迴觸發陷阱
  3. 命名規範:PK_Table, FK_Child_Parent, CK_Table_Rule 利於維護
  4. 文檔化:資料字典記錄每個約束的業務含義

四大完整性層層設防,讓資料庫成為「不說謊的真相來源」,而非髒資料的垃圾場。

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