SQL Server數據庫采用的是關系數據模型,而關系數據模型本身的優點之一就是模型本身集成了數據完整性。作為模型一部分而實施的數據完整性(例如在創建數據表時的列屬性定義)稱作為聲明式(Declarate)數據完整性。用代碼來實施的數據完整性(例如存儲過程、觸發器等)稱為過程式(procedural)數據完整性。
以下介紹幾種聲明式約束概要知識:
一:主鍵約束(Primary Key Constraints)
主鍵約束實施行的唯一約束,同時不允許行的屬性為null值。約束屬性中,每一記錄行只能在數據表中出現一次。換而言之,表內的每行數據可以被唯一確定。
約束的創建:
1:主鍵約束只能在數據表中創建一次;
2:不能再屬性為允許NULL值得列上創建主鍵約束。
創建方法:
1:創建表時在數據列上聲明
create table temp1 (row_id int identity(1,1) not null primary key);
2:創建表后增加約束
alter table temp1 add constraint PK_temp1 primary key(row_id );
為了實施邏輯主鍵的唯一約束,SQL Server 會在后台創建一個唯一索引(Unique Index)。唯一索引是SQL Server實施唯一約束而采用的一種物理機制。
二:唯一約束(Unique Constraints)
唯一約束用來保證數據行的一個列(或一組列)數據的唯一。
約束的創建:
1:與主鍵約束不同,同一張數據表上可以創建多個唯一約束;
2:唯一約束可以定義在NULL值列上;
3:目前SQL Server 只支持在唯一約束列中,只能有一個列為NULL值列
創建方法:
alter table temp1 add constraint UC_temp1 unique (row_id);
與主鍵約束一樣,在創建唯一約束后,SQL Server會創建唯一索引以實施邏輯唯一約束的物理機制。
三:外鍵約束(Foreign Key Constraints)
外鍵約束用於實施引用完整性。外鍵約束在引用表(referencing table )的一組屬性上進行定義,且指向被引用表(referenced table)中的一組候選鍵(主鍵或唯一約束)。外鍵約束的目的是將外鍵列的值域控制在被引用列中現有的值。
約束的創建:
1:引用表和被引用表可以是同一張數據表;
2:即使被引用的候選鍵不允許NuLL值,在外鍵中也可以允許為NULL值;
3:可以在引用表上定義具有級聯功能的外鍵。其目的是,當在對被引用表中的數據行進行刪除(Delete)或更新(Update)操作時,可以自動對引用表中自動進行刪除(Delete)或更新(Update)相關的數據行。
創建方法:
例如:在表A的ID列上定義一個外鍵約束,讓它指向表B中的row_id 列
Alter table A add constraint FK_A_ID Foreign key (ID) references B(row_id) [on delete cascade on update cascade];
注:on delete 和 on update 為可選的定義選項,可定義的操作分為 CASCADE、Set Default、Set Null三種。
cascade:操作(更新或刪除)將被級聯到引用表中相關數據行;
set default:將更新引用表中相關數據行的值為默認值;
set null:將更新引用表中相關數據行的值為null值
外鍵約束實施的引用操作成為“禁止操作(no action)”。禁止操作的含義為:當試圖刪除被引用表中的數據行或更新被引用表中的候選鍵時,如果在引用表中存在相關的數據行,則不允許此操作執行。
四:檢查約束(Check Constraint)
檢查約束用於定義在表中插入或更新一行數據之前必須滿足的一個謂詞(Check Expression) 。
約束的創建:
當謂詞返回的邏輯結果為False時,SQL Server將阻止本次對數據表的新增或更新操作;當謂詞返回的邏輯結果為TRUE或者UNknown時,本次操作通過。
創建方法:
Alter table temp1 add constraint CK_temp1 check (row_id <10000); ----檢查數據列 row_id,使其值不能大於10000
五:默認約束(Default Constraint)
默認約束用來設置數據列的默認值。當對數據表新增一行記錄時,如果沒有為屬性顯示指定明確的值,默認約束將會為其自動設定為默認值。
創建方法:
Create table temp2(date1 datetime); ---創建表Temp2
ALter table temp2 add constraint DK_temp2 default (getdate()) for date1; ---設置數據列 date1的默認值為當前服務器時間