---添加主鍵約束
alter table 表名
add constraint 約束名 primary key (主鍵)
---添加唯一約束
alter table 表名
add constraint 約束名 unique (欄位)
---添加預設約束
alter table 表名
add constraint 約束名 default ('預設內容') for 欄位
--添加檢查check約束,要求欄位只能在1到100之間
alter table 表名
add constraint 約束名 check (欄位 between 1 and 100 )
---添加外鍵約束(主表stuInfo和從表stuMarks建立關係,關聯欄位為stuNo)
alter table 從表
add constraint 約束名
foreign key(關聯欄位) references 主表(關聯欄位)
GO
sql server中刪除約束的語句是:
alter table 表名 drop constraint 約束名
sp_helpconstraint 表名 找到資料表中的所有列的約束
-----------在建立表時建立約束------------
7.2.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 個列組成。
例7-3: 建立一個產品資訊表,以產品編號和名稱為主關鍵字
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]
7.2.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,則SQL Server 會產生一個錯誤,並將父表中的更新操作復原。NO ACTION 是預設值。
NOT FOR REPLICATION
指定列的外關鍵字約束在把從其它表中複製的資料插入到表中時不發生作用。
例7-4:建立一個訂貨表,與前面建立的產品表相關聯
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]
注意:暫存資料表不能指定外關鍵字約束。
7.2.3 惟一性約束
惟一性約束指定一個或多個列的組合的值具有惟一性,以防止在列中輸入重複的值。惟一性約束指定的列可以有NULL 屬性。由於主關鍵字值是具有惟一性的,因此主關鍵字列不能再設定惟一性約束。惟一性約束最多由16 個列組成。
定義惟一性約束的文法如下:
CONSTRAINT constraint_name
UNIQUE [CLUSTERED | NONCLUSTERED]
(column_name1[, column_name2,…,column_name16])
例7-5:定義一個員工資訊表,其中員工的社會安全號碼具有惟一性。
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]
7.2.4 檢查約束
檢查約束對輸入列或整個表中的值設定檢查條件,以限制輸入值,保證資料庫的資料完整性。可以對每個列設定符合檢查。
定義檢查約束的文法如下:
CONSTRAINT constraint_name
CHECK [NOT FOR REPLICATION]
(logical_expression)
各參數說明如下:
NOT FOR REPLICATION
指定檢查約束在把從其它表中複製的資料插入到表中時不發生作用。
logical_expression
指定邏輯條件運算式傳回值為TRUE 或FALSE。
例7-6: 建立一個訂貨表其中定貨量必須不小於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]
注意:對計算資料行不能作除檢查約束外的任何約束。
7.2.5 預設約束
預設約束通過定義列的預設值或使用資料庫的預設值對象綁定表的列,來指定列的預設值。SQL Server 推薦使用預設約束,而不使用定義預設值的方式來指定列的預設值。有關綁定預設約束的方法請參見“資料完整性”章節。
定義預設約束的文法如下:
CONSTRAINT constraint_name
DEFAULT constant_expression [FOR column_name]
例7-7:
constraint de_order_quantity default 100 for order_quantity
注意:不能在建立表時定義預設約束,只能向已經建立好的表中添加預設約束。
7.2.6 列約束和資料表條件約束
對於資料庫來說,約束又分為列約束(Column Constraint)和資料表條件約束(Table Constraint)。
列約束作為列定義的一部分只作用於此列本身。資料表條件約束作為表定義的一部分,可以作用於
多個列。
下面舉例說明列約束與資料表條件約束的區別。
例7-8:
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) /* 資料表條件約束 */