萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> 資料庫綜合

SQL Server 資料庫完整性約束完整指南:主鍵、外鍵、CHECK、DEFAULT 實戰

資料完整性是關聯式資料庫的基石。SQL Server 提供四大類約束——實體、參考、定義域與使用者自訂——確保資料正確、一致且符合業務規則。本文將系統說明各類約束的建立、修改與刪除語法,並附上實戰範例。

一、實體完整性:主鍵

確保每列唯一且非 NULL,唯一識別實體。

1. 建表時定義

CREATE TABLE TableName (
    Sno INT IDENTITY(1,1),
    Sname NVARCHAR(20),
    PRIMARY KEY (Sno)
);

2. 事後新增

ALTER TABLE TableName
ADD CONSTRAINT PK_TableName_Sno PRIMARY KEY (Id);
  • 慣例命名:PK_表名_欄位。
  • 複合主鍵:PRIMARY KEY (Col1, Col2)。

二、參考完整性:外鍵

維護表間關聯,防止孤兒資料。

1. 建表時定義(含級聯動作)

CREATE TABLE TableName (
    Sno INT IDENTITY(1,1) PRIMARY KEY,
    Cno INT NOT NULL,
    FOREIGN KEY (Cno) REFERENCES TableName2(Cno)
        ON DELETE CASCADE    -- 級聯刪除
        ON UPDATE CASCADE    -- 級聯更新
        -- ON DELETE NO ACTION -- 刪除限制(預設)
);

2. 事後新增

ALTER TABLE TableName
ADD CONSTRAINT FK_TableName_TableName2
FOREIGN KEY (Cid) REFERENCES TableName2(Cid);
  • 慣例命名:FK_子表_父表。
  • 級聯選項:CASCADE、SET NULL、SET DEFAULT、NO ACTION。

三、使用者定義完整性

1. 非空約束

ALTER TABLE TableName
ALTER COLUMN Name VARCHAR(20) NOT NULL;

2. 唯一約束

ALTER TABLE TableName
ADD CONSTRAINT UQ_TableName_ColName UNIQUE (ColName);
  • 允許一個 NULL(若為單欄位);可建立篩選索引實現「非 NULL 唯一」。

3. 檢查約束

ALTER TABLE TableName
ADD CONSTRAINT CK_TableName_ColName CHECK (Age > 5);
  • 可包含任意布林運算式,甚至呼叫標量函數(謹慎使用,影響效能)。
  • NOCHECK 可暫停驗證既有資料:ALTER TABLE ... NOCHECK CONSTRAINT ...。

4. 預設約束

ALTER TABLE TableName
ADD CONSTRAINT DF_TableName_ColName DEFAULT ('男') FOR Gender;
  • INSERT 未指定欄位時自動填入預設值。
  • 慣例命名:DF_表名_欄位。

四、約束管理:查詢、停用、刪除

查詢現有約束

SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_NAME = 'TableName';

暫時停用/啟用

-- 停用
ALTER TABLE TableName NOCHECK CONSTRAINT CK_TableName_ColName;
-- 啟用並驗證既有資料
ALTER TABLE TableName CHECK CONSTRAINT CK_TableName_ColName;

刪除約束

ALTER TABLE TableName DROP CONSTRAINT DF_TableName_ColName;

五、命名規範與最佳實踐

約束類型命名慣例備註
Primary KeyPK_TableName_Col(s)每表僅一個
Foreign KeyFK_ChildTable_ParentTable建議加索引於 FK 欄位
UniqueUQ_TableName_Col(s)
CheckCK_TableName_Col/Rule業務規則命名
DefaultDF_TableName_Col
  • **永遠顯式命名約束**,避免系統產生難以辨識的名稱(如 PK__TableNa__3214EC07...),利於維運與腳本比對。
  • 外鍵欄位**務必建立索引**,否則父表刪除/更新時會掃描子表全表,造成嚴重阻塞。
  • 大量匯入資料時,可先 NOCHECK CONSTRAINT ALL,匯入後再 CHECK CONSTRAINT ALL 驗證。

完善的約束設計,能將業務規則下沉至資料庫層,成為最後一道防線,讓應用程式更輕量、資料更可靠。

copyright © 萬盛學電腦網 all rights reserved