資料完整性是關聯式資料庫的基石。SQL Server 提供四大類約束——實體、參考、定義域與使用者自訂——確保資料正確、一致且符合業務規則。本文將系統說明各類約束的建立、修改與刪除語法,並附上實戰範例。
確保每列唯一且非 NULL,唯一識別實體。
CREATE TABLE TableName (
Sno INT IDENTITY(1,1),
Sname NVARCHAR(20),
PRIMARY KEY (Sno)
);
ALTER TABLE TableName
ADD CONSTRAINT PK_TableName_Sno PRIMARY KEY (Id);
PK_表名_欄位。PRIMARY KEY (Col1, Col2)。維護表間關聯,防止孤兒資料。
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 -- 刪除限制(預設)
);
ALTER TABLE TableName
ADD CONSTRAINT FK_TableName_TableName2
FOREIGN KEY (Cid) REFERENCES TableName2(Cid);
FK_子表_父表。CASCADE、SET NULL、SET DEFAULT、NO ACTION。ALTER TABLE TableName
ALTER COLUMN Name VARCHAR(20) NOT NULL;
ALTER TABLE TableName
ADD CONSTRAINT UQ_TableName_ColName UNIQUE (ColName);
ALTER TABLE TableName
ADD CONSTRAINT CK_TableName_ColName CHECK (Age > 5);
NOCHECK 可暫停驗證既有資料:ALTER TABLE ... NOCHECK CONSTRAINT ...。ALTER TABLE TableName
ADD CONSTRAINT DF_TableName_ColName DEFAULT ('男') FOR Gender;
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 Key | PK_TableName_Col(s) | 每表僅一個 |
| Foreign Key | FK_ChildTable_ParentTable | 建議加索引於 FK 欄位 |
| Unique | UQ_TableName_Col(s) | |
| Check | CK_TableName_Col/Rule | 業務規則命名 |
| Default | DF_TableName_Col |
PK__TableNa__3214EC07...),利於維運與腳本比對。NOCHECK CONSTRAINT ALL,匯入後再 CHECK CONSTRAINT ALL 驗證。完善的約束設計,能將業務規則下沉至資料庫層,成為最後一道防線,讓應用程式更輕量、資料更可靠。