數(shù)據(jù)庫(kù)中的五種約束及其添加方法
五大約束
1.—-主鍵約束(Primay Key Coustraint) 唯一性,非空性
2.—-唯一約束 (Unique Counstraint)唯一性,可以空,但只能有一個(gè)
3.—-檢查約束 (Check Counstraint) 對(duì)該列數(shù)據(jù)的范圍、格式的限制(如:年齡、性別等)
4.—-默認(rèn)約束 (Default Counstraint) 該數(shù)據(jù)的默認(rèn)值
5.—-外鍵約束 (Foreign Key Counstraint) 需要建立兩表間的關(guān)系并引用主表的列
五大約束的語(yǔ)法示例
1.—-添加主鍵約束(將stuNo作為主鍵)
alter table stuInfo
add constraint PK_stuNo primary key (stuNo)
2.—-添加唯一約束(身份證號(hào)唯一,因?yàn)槊總€(gè)人的都不一樣)
alter table stuInfo
add constraint UQ_stuID unique(stuID)
3.—-添加默認(rèn)約束(如果地址不填 默認(rèn)為“地址不詳”)
alter table stuInfo
add constraint DF_stuAddress default (‘地址不詳’) for stuAddress
4.—-添加檢查約束 (對(duì)年齡加以限定 15-40歲之間)
alter table stuInfo
add constraint CK_stuAge check (stuAge between 15 and 40)
alter table stuInfo
add constraint CK_stuSex check (stuSex=’男’ or stuSex=’女′)
5.—-添加外鍵約束 (主表stuInfo和從表stuMarks建立關(guān)系,關(guān)聯(lián)字段stuNo)
alter table stuInfo
add constraint FK_stuNo foreign key(stuNo)references stuinfo(stuNo)
約束(Constraint)是Microsoft SQL Server 提供的自動(dòng)保持?jǐn)?shù)據(jù)庫(kù)完整性的一種方法,定義了可輸入表或表的單個(gè)列中的數(shù)據(jù)的限制條件(有關(guān)數(shù)據(jù)完整性的介紹請(qǐng)參見(jiàn)第9 章)。在SQL Server 中有5 種約束:主關(guān)鍵字約束(Primary Key Constraint)、外關(guān)鍵字約束(Foreign Key Constraint)、惟一性約束(Unique Constraint)、檢查約束(Check Constraint)和缺省約束(Default Constraint)。
1 主關(guān)鍵字約束
主關(guān)鍵字約束指定表的一列或幾列的組合的值在表中具有惟一性,即能惟一地指定一行記錄。每個(gè)表中只能有一列被指定為主關(guān)鍵字,且IMAGE 和TEXT 類型的列不能被指定為主關(guān)鍵字,也不允許指定主關(guān)鍵字列有NULL 屬性。
定義主關(guān)鍵字約束的語(yǔ)法如下:
CONSTRAINT constraint_name
PRIMARY KEY [CLUSTERED | NONCLUSTERED]
(column_name1[, column_name2,…,column_name16])
各參數(shù)說(shuō)明如下:
constraint_name
指定約束的名稱約束的名稱。在數(shù)據(jù)庫(kù)中應(yīng)是惟一的。如果不指定,則系統(tǒng)會(huì)自動(dòng)生成一個(gè)約束名。
CLUSTERED | NONCLUSTERED
指定索引類別,CLUSTERED 為缺省值。其具體信息請(qǐng)參見(jiàn)下一章。
column_name
指定組成主關(guān)鍵字的列名。主關(guān)鍵字最多由16 個(gè)列組成。
例7-3: 創(chuàng)建一個(gè)產(chǎn)品信息表,以產(chǎn)品編號(hào)和名稱為主關(guān)鍵字
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 外關(guān)鍵字約束
外關(guān)鍵字約束定義了表之間的關(guān)系。當(dāng)一個(gè)表中的一個(gè)列或多個(gè)列的組合和其它表中的主關(guān)鍵字定義相同時(shí),就可以將這些列或列的組合定義為外關(guān)鍵字,并設(shè)定它適合哪個(gè)表中哪些列相關(guān)聯(lián)。這樣,當(dāng)在定義主關(guān)鍵字約束的表中更新列值,時(shí)其它表中有與之相關(guān)聯(lián)的外關(guān)鍵字約束的表中的外關(guān)鍵字列也將被相應(yīng)地做相同的更新。外關(guān)鍵字約束的作用還體現(xiàn)在,當(dāng)向含有外關(guān)鍵字的表插入數(shù)據(jù)時(shí),如果與之相關(guān)聯(lián)的表的列中無(wú)與插入的外關(guān)鍵字列值相同的值時(shí),系統(tǒng)會(huì)拒絕插入數(shù)據(jù)。與主關(guān)鍵字相同,不能使用一個(gè)定義為 TEXT 或IMAGE 數(shù)據(jù)類型的列創(chuàng)建外關(guān)鍵字。外關(guān)鍵字最多由16 個(gè)列組成。
定義外關(guān)鍵字約束的語(yǔ)法如下:
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 ]
各參數(shù)說(shuō)明如下:
REFERENCES
指定要建立關(guān)聯(lián)的表的信息。
ref_table
指定要建立關(guān)聯(lián)的表的名稱。
ref_column
指定要建立關(guān)聯(lián)的表中的相關(guān)列的名稱。
ON DELETE {CASCADE | NO ACTION}
指定在刪除表中數(shù)據(jù)時(shí),對(duì)關(guān)聯(lián)表所做的相關(guān)操作。在子表中有數(shù)據(jù)行與父表中的對(duì)應(yīng)數(shù)據(jù)行相關(guān)聯(lián)的情況下,如果指定了值CASCADE,則在刪除父表數(shù)據(jù)行時(shí)會(huì)將子表中對(duì)應(yīng)的數(shù)據(jù)行刪除;如果指定的是NO ACTION,則SQL Server 會(huì)產(chǎn)生一個(gè)錯(cuò)誤,并將父表中的刪除操作回滾。NO ACTION 是缺省值。
ON UPDATE {CASCADE | NO ACTION}
指定在更新表中數(shù)據(jù)時(shí),對(duì)關(guān)聯(lián)表所做的相關(guān)操作。在子表中有數(shù)據(jù)行與父表中的對(duì)應(yīng)數(shù)據(jù)行相關(guān)聯(lián)的情況下,如果指定了值CASCADE,則在更新父表數(shù)據(jù)行時(shí)會(huì)將子表中對(duì)應(yīng)的數(shù)據(jù)行更新;如果指定的是NO ACTION,則SQL Server 會(huì)產(chǎn)生一個(gè)錯(cuò)誤,并將父表中的更新操作回滾。NO ACTION 是缺省值。
NOT FOR REPLICATION
指定列的外關(guān)鍵字約束在把從其它表中復(fù)制的數(shù)據(jù)插入到表中時(shí)不發(fā)生作用。
例7-4:創(chuàng)建一個(gè)訂貨表,與前面創(chuàng)建的產(chǎn)品表相關(guān)聯(lián)
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]
注意:臨時(shí)表不能指定外關(guān)鍵字約束。
惟一性約束
惟一性約束指定一個(gè)或多個(gè)列的組合的值具有惟一性,以防止在列中輸入重復(fù)的值。惟一性約束指定的列可以有NULL 屬性。由于主關(guān)鍵字值是具有惟一性的,因此主關(guān)鍵字列不能再設(shè)定惟一性約束。惟一
性約束最多由16 個(gè)列組成。
定義惟一性約束的語(yǔ)法如下:
CONSTRAINT constraint_name
UNIQUE [CLUSTERED | NONCLUSTERED]
(column_name1[, column_name2,…,column_name16])
例7-5:定義一個(gè)員工信息表,其中員工的身份證號(hào)具有惟一性。
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 檢查約束
檢查約束對(duì)輸入列或整個(gè)表中的值設(shè)置檢查條件,以限制輸入值,保證數(shù)據(jù)庫(kù)的數(shù)據(jù)完整性??梢詫?duì)每個(gè)列設(shè)置符合檢查。
定義檢查約束的語(yǔ)法如下:
CONSTRAINT constraint_name
CHECK [NOT FOR REPLICATION]
(logical_expression)
各參數(shù)說(shuō)明如下:
NOT FOR REPLICATION
指定檢查約束在把從其它表中復(fù)制的數(shù)據(jù)插入到表中時(shí)不發(fā)生作用。
logical_expression
指定邏輯條件表達(dá)式返回值為T(mén)RUE 或FALSE。
例7-6: 創(chuàng)建一個(gè)訂貨表其中定貨量必須不小于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]
注意:對(duì)計(jì)算列不能作除檢查約束外的任何約束。
7.2.5 缺省約束
缺省約束通過(guò)定義列的缺省值或使用數(shù)據(jù)庫(kù)的缺省值對(duì)象綁定表的列,來(lái)指定列的缺省值。SQL Server 推薦使用缺省約束,而不使用定義缺省值的方式來(lái)指定列的缺省值。有關(guān)綁定缺省約束的方法請(qǐng)參見(jiàn)“數(shù)據(jù)完整性”章節(jié)。
定義缺省約束的語(yǔ)法如下:
CONSTRAINT constraint_name
DEFAULT constant_expression [FOR column_name]
例7-7:
constraint de_order_quantity default 100 for order_quantity
注意:不能在創(chuàng)建表時(shí)定義缺省約束,只能向已經(jīng)創(chuàng)建好的表中添加缺省約束。
7.2.6 列約束和表約束
對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō),約束又分為列約束(Column Constraint)和表約束(Table Constraint)。
列約束作為列定義的一部分只作用于此列本身。表約束作為表定義的一部分,可以作用于
多個(gè)列。
下面舉例說(shuō)明列約束與表約束的區(qū)別。
例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) /* 表約束 */