一、約束
約束定義關於列中允許值的規則,是強制完整性的標準機制。
使用約束優先於使用觸發器、規則和預設值。查詢優化器也使用約束定義生成高效能的查詢執行計畫。sql server 2005支援五類約束:
1. not null指定不接受null值的列。
2. check 約束對可以放入列中的值進行限制,以強制執行域的完整性。check約束拒絕所有在檢測條件中取值為false的值。可以為每列指定多個check約束。下例顯示名為chk_id約束的建立,該約束確保只對此關鍵字輸入指定範圍內的數字,以進一步強制執行主鍵的域。
create table cust_sample
(
cust_id int primary key,
cust_name char(50),
cust_address char(50),
cust_credit_limit money,
constraint chk_id check(cust_id between 0 and 10000)
)
3. unique約束:對於 unique 約束中的列,表中不允許有兩行包含相同的非空值。主鍵也強制執行唯一性,但主鍵不允許空值。unique 約束優先於唯一索引。
4. primary key 約束標識列或列集,這些列或列集的值唯一標識表中的行。在乙個表中,不能有兩行包含相同的主鍵值。不能在主鍵內的任何列中輸入null值。在資料庫中null是特殊值,代表不同於空白和0值的未知值。建議使用乙個小的整數列作為主鍵。每個表都應有乙個主鍵。
乙個表中可以有乙個以上的列組合,這些組合能唯一標識表中的行,每個組合就是乙個候選鍵。資料庫管理員從候選鍵中選擇乙個作為主鍵。例如,在part_sample表中,part_nmbr和part_name都可以是候選鍵,但是只將part_nmbr選作主鍵。
create table part_sample
( part_nmbr int primary key,
part_name char(30),
part_weight decimal(6,2),
part_color char(15)
)
5. foreign key約束標識表之間的關係。
乙個表的外來鍵指向另乙個表的候選鍵。當外鍵值沒有候選鍵時,外來鍵可防止操作保留帶外鍵值的行。在下例中,order_part 表建立乙個外來鍵引用前面定義的part_sample表。通常情況下,order_part在order表上也有乙個外來鍵,下面只不過是乙個簡單示例。
create table order_part
( order_nmbr int,
part_nmbr int
foreign key references part_sample(part_nmbr) on delete no action,
qty_ordered int
)
如果乙個外鍵值沒有候選鍵,則不能插入帶該值(null除外)的行。如果嘗試刪除現有外來鍵指向的行,on delete子句將控制所採取的操作。
on delete子句有兩個選項:
a、no action指定刪除因錯誤而失敗。
b、cascade 指定還將刪除包含指向已刪除行的外來鍵的所有行。
如果嘗試更新現有外來鍵指向的候選鍵值,on update 子句將定義所採取的操作。它也支援no action和cascade選項。
列約束和表約束
約束可以是列約束或表約束:
列約束被指定為列定義的一部分,並且僅適用於那個列(前面的示例中的約束就是列約束)。
表約束的宣告與列的定義無關,可以適用於表中乙個以上的列。
當乙個約束中必須包含乙個以上的列時,必須使用表約束。
例如,如果乙個表的主鍵內有兩個或兩個以上的列,則必須使用表約束將這兩列加入主鍵內。假設有乙個表記錄工廠內的一台計算機上所發生的事件。假定有幾類事件可以同時發生,但不能有兩個同時發生的事件屬於同一型別。這一點可以通過將type列和time列加入雙列主鍵內來強制執行。
create table factory_process
( event_type int,
event_time datetime,
event_site char(50),
event_desc char(1024),
constraint event_key primary key(event_type,event_time)
)
二、規則:
規則是乙個向後相容的功能,用於執行一些與check約束相同的功能。check約束是用來限制列值的首選標準方法。check約束比規則更簡明,乙個列只能應用乙個規則,但是卻可以應用多個check約束。check約束作為create table 語句的一部分進行指定,而規則以單獨的物件建立,然後繫結到列上。
下例建立乙個規則,執行與前面主題中的check約束示例相同的功能。sql srver2005 首選的方法是 check 約束。
create rule id_chk as @id between 0 and 10000
go
create table cust_sample
(
cust_id int
primary key,
cust_name char(50),
cust_address char(50),
cust_credit_limit money,
)
go
sp_bindrule id_chk,'cust_sample.cust_id'
go
SQL檢視CHECK約束資訊
以下兩個語句均基於系統表sysobjects syscomments和系統檢視sysconstraints,查詢結果中包括表id 表名 列id 列名 check約束id check約束名 check約束status值以及check約束的內容,tccview為table column check vi...
SQL檢視CHECK約束資訊
以下兩個語句均基於系統表sysobjects syscomments和系統檢視sysconstraints,查詢結果中包括表id 表名 列id 列名 check約束id check約束名 check約束status值以及check約束的內容,tccview為table column check vi...
SQL檢視CHECK約束資訊
以下兩個語句均基於系統表sysobjects syscomments和系統檢視sysconstraints,查詢結果中包括表id 表名 列id 列名 check約束id check約束名 check約束status值以及check約束的內容,tccview為table column check vi...