SQL Server 資料完整性的實現——約束
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的預設值為當前伺服器時間