-- 資料行層級
job_id int PRIMARY KEY CLUSTERED
-- 資料表層級 (複合鍵、命名、指定非叢集)
emp_id empid CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED
-- 資料行層級
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)
ON DELETE/UPDATE {CASCADE|SET NULL|NO ACTION}
-- 單欄
person varchar(30) NULL UNIQUE NONCLUSTERED
-- 複合、命名
CONSTRAINT U_store UNIQUE NONCLUSTERED (stor_name, city)
-- 日期自動取當下
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」錯誤。
-- 單欄範圍
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]')
ALTER TABLE DROP CONSTRAINT最佳實踐:
1. **所有約束皆命名** (PK_, FK_, UQ_, DF_, CK_),版本控管與除錯極易。
2. 業務規則優先在資料庫層實現 (CHECK/FK),前端僅做使用者體驗驗證。
3. 大量匯入時可暫時 NOCHECK CONSTRAINT,完成後 WITH CHECK CHECK CONSTRAINT 驗證既有資料。