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

SQL Server 約束完整指南:主鍵、外鍵、唯一、檢查、預設五大約束詳解

     編輯:關於SqlServer

約束:資料完整性的守門員

約束定義可輸入資料的限制條件,自動維護資料庫完整性。SQL Server 提供五種:

  1. 主鍵約束
  2. 外鍵約束
  3. 唯一約束
  4. 檢查約束
  5. 預設約束

1. 主鍵約束

  • 指定單欄或多欄組合唯一識別每一列
  • 每張表僅能有一個主鍵
  • IMAGE、TEXT 型別不可為主鍵
  • 主鍵欄位不允許 NULL

語法

CONSTRAINT constraint_name
PRIMARY KEY [CLUSTERED | NONCLUSTERED]
( column_name1 [, column_name2, ..., column_name16] )
  • constraint_name:資料庫內唯一,省略則系統自動產生
  • CLUSTERED 為預設索引類型
  • 最多 16 欄組合

範例:產品資訊表,主鍵為 (產品編號, 產品名稱)

CREATE TABLE products (
    p_id     CHAR(8) NOT NULL,
    p_name   CHAR(10) NOT NULL,
    price    MONEY DEFAULT 0.01,
    quantity SMALLINT NULL,
    CONSTRAINT pk_p_id PRIMARY KEY (p_id, p_name)
) ON [PRIMARY]

2. 外鍵約束

  • 定義表與表之間的關係
  • 參考其他表的主鍵(或唯一約束)欄位
  • 插入/更新時驗證參考值是否存在,不存在則拒絕
  • 支援級聯動作:ON DELETE/UPDATE { CASCADE | NO ACTION }
  • 同樣不支援 TEXT/IMAGE 型別,最多 16 欄

語法

CONSTRAINT constraint_name
FOREIGN KEY ( column_name1 [, ..., column_name16] )
REFERENCES ref_table [ ( ref_column1 [, ..., ref_column16] ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
  • REFERENCES 指定被參考資料表
  • 省略參考欄位時,預設參考該表主鍵

3. 唯一約束

  • 確保欄位值不重複,但允許 單一 NULL
  • 一張表可建立多個唯一約束
  • 常用於候選鍵(如 Email、身分證字號)

4. 檢查約束

  • 限定欄位值必須符合布林運算式
  • 例:CHECK (age >= 18 AND age <= 100)
  • 可跨欄位驗證(同一資料列內)

5. 預設約束

  • 插入資料未指定欄位值時,自動填入預設值
  • 例:DEFAULT GETDATE()、DEFAULT 0
  • 簡化應用程式邏輯

綜合範例:訂單明細表

CREATE TABLE order_details (
    order_id   INT NOT NULL,
    product_id INT NOT NULL,
    qty        SMALLINT NOT NULL DEFAULT 1 CHECK (qty > 0),
    unit_price MONEY NOT NULL CHECK (unit_price >= 0),
    CONSTRAINT pk_od PRIMARY KEY (order_id, product_id),
    CONSTRAINT fk_od_order FOREIGN KEY (order_id) REFERENCES orders(order_id),
    CONSTRAINT fk_od_prod  FOREIGN KEY (product_id) REFERENCES products(product_id),
    CONSTRAINT uq_od_unique UNIQUE (order_id, product_id) -- 實際上 PK 已隱含
)

最佳實務

  • 明確命名約束(pk_, fk_, ck_, df_, uq_ 前綴)利於維護
  • 外鍵建議加上 ON DELETE CASCADE 或 NO ACTION 明確語意
  • 檢查約束條件勿過於複雜,影響插入效能
  • 定期用 DBCC CHECKCONSTRAINTS 驗證現有資料合規性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved