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

SQL Server 約束完整語法速查:PRIMARY KEY、FOREIGN KEY、UNIQUE、DEFAULT、CHECK

     編輯:關於SqlServer

1. PRIMARY KEY — 實體完整性核心


-- 資料行層級
job_id int PRIMARY KEY CLUSTERED

-- 資料表層級 (複合鍵、命名、指定非叢集)
emp_id empid CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED
  • 唯一 + NOT NULL
  • 預設建立叢集索引,可指定 NONCLUSTERED
  • 每表僅一個 PK

2. FOREIGN KEY — 參考完整性


-- 資料行層級
job_id smallint NOT NULL REFERENCES jobs(job_id)

-- 資料表層級 (複合 FK、命名)
CONSTRAINT FK_sales FOREIGN KEY (stor_id, ord_num, title_id)
REFERENCES sales(stor_id, ord_num, title_id)
  • 參考欄位必須在父表有 UNIQUE/PK 約束
  • 可指定 ON DELETE/UPDATE {CASCADE|SET NULL|NO ACTION}

3. UNIQUE — 候選鍵、業務唯一性


-- 單欄
person varchar(30) NULL UNIQUE NONCLUSTERED

-- 複合、命名
CONSTRAINT U_store UNIQUE NONCLUSTERED (stor_name, city)
  • 允許 **單一 NULL** (ANSI 標準),多個 NULL 會違反唯一性
  • 預設建立非叢集索引

4. DEFAULT — 缺值自動填充


-- 日期自動取當下
modi_date datetime DEFAULT GETDATE()

-- 使用者名稱
modifier char(5) DEFAULT USER

-- 建表完整範例
CREATE TABLE price (
    prod_id char(5),
    sup_id char(5),
    unit_price money,
    modifier char(5) DEFAULT USER,
    modi_date datetime DEFAULT GETDATE(),
    PRIMARY KEY (prod_id, sup_id)
);

注意:應用層 (如 DataGrid) 新增列時需自行賦值 DEFAULT,否則可能觸發「Row cannot be located for updating」錯誤。

5. CHECK — 定義域完整性


-- 單欄範圍
CHECK (min_lvl >= 10)
CHECK (max_lvl <= 250)

-- 格式驗證 (正則語意)
CONSTRAINT CK_emp_id CHECK (
    emp_id LIKE '[a-z][a-z][a-z][1-9][0-9][0-9][0-9][0-9]' 
    OR emp_id LIKE '[a-z][a-z][1-9][0-9][0-9][0-9][0-9]'
)

-- 離散值清單
CHECK (pub_id IN ('1389','0736','0877') OR pub_id LIKE '99[0-9][0-9]')
  • 可參考其他資料行 (同表)
  • 不支援子查詢、非確定性函數 (如 GETDATE())
  • 命名約束利於後續管理 ALTER TABLE DROP CONSTRAINT

最佳實踐:
1. **所有約束皆命名** (PK_, FK_, UQ_, DF_, CK_),版本控管與除錯極易。
2. 業務規則優先在資料庫層實現 (CHECK/FK),前端僅做使用者體驗驗證。
3. 大量匯入時可暫時 NOCHECK CONSTRAINT,完成後 WITH CHECK CHECK CONSTRAINT 驗證既有資料。

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