約束(Constraint)是Microsoft SQL Server 提供的自動保持資料庫完整性的一種方法,定義了可輸入表或表的單個列中的資料的限制條件.
在SQL Server 中有5 種約束:主關鍵字約束(Primary Key Constraint)、外關鍵字約束(Foreign Key Constraint)、惟一性約束(Unique Constraint)、檢查約束(Check Constraint)和預設約束(Default Constraint)。
1 主關鍵字約束主關鍵字約束指定表的一列或幾列的組合的值在表中具有惟一性,即能惟一地指定一行記錄。每個表中只能有一列被指定為主關鍵字,且IMAGE 和TEXT 類型的列不能被指定為主關鍵字,也不允許指定主關鍵字列有NULL 屬性。定義主關鍵字約束的文法如下: CONSTRAINT constraint_name PRIMARY KEY [CLUSTERED | NONCLUSTERED] (column_name1[, column_name2,…,column_name16])各參數說明如下:
constraint_name 指定約束的名稱約束的名稱。在資料庫中應是惟一的。如果不指定,則系統會自動產生一個約束名。 CLUSTERED | NONCLUSTERED 指定索引類別,CLUSTERED 為預設值。其具體資訊請參見下一章。 column_name 指定組成主關鍵字的列名。主關鍵字最多由16 個列組成。
如: 建立一個產品資訊表,以產品編號和名稱為主關鍵字 create table products ( p_id char(8) not null, p_name char(10) not null , price money default 0.01 , quantity smallint null , constraint pk_p_id primary key (p_id, p_name) ) on [primary]
2:外關鍵字約束外關鍵字約束定義了表之間的關係。當一個表中的一個列或多個列的組合和
其它表中的主關鍵字定義相同時,就可以將這些列或列的組合定義為外關鍵字,並設定它適合
哪個表中哪些列相關聯。這樣,當在定義主關鍵字約束的表中更新列值,時其它表中有與之相
關聯的外關鍵字約束的表中的外關鍵字列也將被相應地做相同的更新。外關鍵字約束的作用還
體現在,當向含有外關鍵字的表插入資料時,如果與之相關聯的表的列中無與插入的外關鍵字
列值相同的值時,系統會拒絕插入資料。與主關鍵字相同,不能使用一個定義為 TEXT 或
IMAGE 資料類型的列建立外關鍵字。外關鍵字最多由16 個列組成。定義外關鍵字約束的文法
如下: CONSTRAINT constraint_name FOREIGN KEY (column_name1[, column_name2,…,column_name16]) REFERENCES ref_table [ (ref_column1[,ref_column2,…, ref_column16] )] [ ON DELETE { CASCADE | NO ACTION } ] [ ON UPDATE { CASCADE | NO ACTION } ] ] [ NOT FOR REPLICATION ] 各參數說明如下:
REFERENCES 指定要建立關聯的表的資訊。 ref_table 指定要建立關聯的表的名稱。
ref_column 指定要建立關聯的表中的相關列的名稱。 ON DELETE {CASCADE | NO ACTION} 指
定在刪除表中資料時,對關聯表所做的相關操作。在子表中有資料行與父表中的對應資料行相
關聯的情況下,如果指定了值CASCADE,則在刪除父表資料行時會將子表中對應的資料行刪
除;如果指定的是NO ACTION,則SQL Server 會產生一個錯誤,並將父表中的刪除操作復原。
NO ACTION 是預設值。 ON UPDATE {CASCADE | NO ACTION} 指定在更新表中資料時,對關聯
表所做的相關操作。在子表中有資料行與父表中的對應資料行相關聯的情況下,如果指定了值
CASCADE,則在更新父表資料行時會將子表中對應的資料行更新;如果指定的是NO ACTION,則S
QL Server 會產生一個錯誤,並將父表中的更新操作復原。NO ACTION 是預設值。 NOT FOR
REPLICATION 指定列的外關鍵字約束在把從其它表中複製的資料插入到表中時不發生作用。
如:建立一個訂貨表,與前面建立的產品表相關聯 create table orders( order_id char(8), p_id char(8), p_name char(10) , constraint pk_order_id primary key (order_id) , foreign key(p_id, p_name) references products(p_id, p_name) ) on [primary] 注意:暫存資料表不能指定外關鍵字約束。
3 惟一性約束惟一性約束指定一個或多個列的組合的值具有惟一性,以防止在列中輸入重複的值。惟一性約束指定的列可以有NULL 屬性。由於主關鍵字值是具有惟一性的,因此主關鍵字列不能再設定惟一性約束。惟一性約束最多由16 個列組成。定義惟一性約束的文法如下: CONSTRAINT constraint_name UNIQUE [CLUSTERED | NONCLUSTERED] (column_name1[, column_name2,…,column_name16])
如:定義一個員工資訊表,其中員工的社會安全號碼具有惟一性。 create table employees ( emp_id char(8), emp_name char(10) , emp_cardid char(18), constraint pk_emp_id primary key (emp_id), constraint uk_emp_cardid unique (emp_cardid) ) on [primary]
4: 檢查約束檢查約束對輸入列或整個表中的值設定檢查條件,以限制輸入值,保證資料庫的資料完整性。可以對每個列設定符合檢查。定義檢查約束的文法如下: CONSTRAINT constraint_name CHECK [NOT FOR REPLICATION] (logical_expression) 各參數說明如下: NOT FOR REPLICATION 指定檢查約束在把從其它表中複製的資料插入到表中時不發生作用。 logical_expression 指定邏輯條件運算式傳回值為TRUE 或FALSE。
如: 建立一個訂貨表其中定貨量必須不小於10。 create table orders( order_id char(8), p_id char(8), p_name char(10) , quantity smallint, constraint pk_order_id primary key (order_id), constraint chk_quantity check (quantity>=10) , ) on [primary] 注意:對計算資料行不能作除檢查約束外的任何約束。
5 預設約束預設約束通過定義列的預設值或使用資料庫的預設值對象綁定表的列,來指定列的預設值。SQL Server 推薦使用預設約束,而不使用定義預設值的方式來指定列的預設值。
定義預設約束的文法如下: CONSTRAINT constraint_name DEFAULT constant_expression [FOR column_name]
如: constraint de_order_quantity default 100 for order_quantity 注意:不能在建立表時定義預設約束,只能向已經建立好的表中添加預設約束。
6 列約束和資料表條件約束對於資料庫來說,約束又分為列約束(Column Constraint)和資料表條件約束(Table Constraint)。列約束作為列定義的一部分只作用於此列本身。資料表條件約束作為表定義的一部分,可以作用於多個列。下面舉例說明列約束與資料表條件約束的區別。
如: create table products ( p_id char(8) , p_name char(10) , price money default 0.01 , quantity smallint check (quantity>=10) , /* 列約束 */ constraint pk_p_id primary key (p_id, p_name) /* 資料表條件約束 */