https://www.cnblogs.com/willingtolove/p/9215330.html
#五大約束
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)系并引用主表的列
#五大約束的語法示例
1、添加主鍵約束(將UserId作為主鍵)
alter table UserIdadd constraint PK_UserId primary key (UserId)
2蒜撮、添加唯一約束(身份證號(hào)唯一暴构,因?yàn)槊總€(gè)人的都不一樣)
alter table UserInfoadd constraint UQ_IDNumber unique(IdentityCardNumber)
3跪呈、添加默認(rèn)約束(如果地址不填 默認(rèn)為“地址不詳”)
alter table UserInfoadd constraint DF_UserAddress default (‘地址不詳’) for UserAddress
4、添加檢查約束 (對(duì)年齡加以限定 20-40歲之間)
alter table UserInfoadd constraint CK_UserAge check (UserAge between 20 and 40)
alter table UserInfoadd constraint CK_UserSex check (UserSex=’男’ or UserSex=’女′)
5取逾、添加外鍵約束 (主表UserInfo和從表UserOrder建立關(guān)系耗绿,關(guān)聯(lián)字段UserId)
alter table UserOrderadd constraint FK_UserId_UserId foreign key(UserId)references UserInfo(UserId)
#SQL Server中五大約束詳解
約束(Constraint)是Microsoft SQL Server 提供的自動(dòng)保持?jǐn)?shù)據(jù)庫完整性的一種方法,定義了可輸入表或表的單個(gè)列中的數(shù)據(jù)的限制條件砾隅。在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 屬性卦停。
此處應(yīng)有說明:多列組成的主鍵叫聯(lián)合主鍵,而且聯(lián)合主鍵約束只能設(shè)定為表級(jí)約束恼蓬;單列組成的主鍵惊完,既可設(shè)定為列級(jí)約束,也可以設(shè)定為表級(jí)約束处硬。**
聯(lián)合主鍵:
聯(lián)合主鍵就是用2個(gè)或2個(gè)以上的字段組成主鍵专执。用這個(gè)主鍵包含的字段作為主鍵,這個(gè)組合在數(shù)據(jù)表中是唯一郁油,且加了主鍵索引。
可以這么理解攀痊,比如桐腌,你的訂單表里有很多字段,一般情況只要有個(gè)訂單號(hào)bill_no做主鍵就可以了苟径,但是案站,現(xiàn)在要求可能會(huì)有補(bǔ)充訂單,使用相同的訂單號(hào)棘街,那么這時(shí)單獨(dú)使用訂單號(hào)就不可以了蟆盐,因?yàn)闀?huì)有重復(fù)。那么你可以再使用個(gè)訂單序列號(hào)bill_seq來作為區(qū)別遭殉。把bill_no和bill_seq設(shè)成聯(lián)合主鍵石挂。即使bill_no相同,bill_seq不同也是可以的险污。
#定義主關(guān)鍵字約束的語法如下:
CONSTRAINT constraint_name PRIMARY KEY [CLUSTERED |
NONCLUSTERED] (column_name1[, column_name2,…,column_name16])
#各參數(shù)說明如下:
constraint_name
指定約束的名稱約束的名稱痹愚。在數(shù)據(jù)庫中應(yīng)是惟一的富岳。如果不指定,則系統(tǒng)會(huì)自動(dòng)生成一個(gè)約束名拯腮。
CLUSTERED | NONCLUSTERED
指定索引類別窖式,CLUSTERED 為缺省值。
column_name
指定組成主關(guān)鍵字的列名动壤。主關(guān)鍵字最多由16 個(gè)列組成萝喘。
#例子:
CREATE TABLE [dbo].[UserInfo](
[UserId] [int] NOT NULL,
[UserName] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_UserInfo] PRIMARY KEY CLUSTERED
(
[UserId] ASC,
[UserName] ASC
)
) 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)的表的列中無與插入的外關(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)鍵字約束的語法如下:
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ù)說明如下:
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ā)生作用盯荤。
#例子:
1 CREATE TABLE [dbo].[UserOrder](
2 [OrderId] [int] NOT NULL,
3 [UserId] [int] NOT NULL,
4 [UserName] [nvarchar](50) NOT NULL,
5 CONSTRAINT fk_userid_username FOREIGN KEY([UserId],[UserName]) REFERENCES UserInfo(UserId,UserName) ON DELETE CASCADE,
6 ) ON [PRIMARY]
3、惟一性約束
惟一性約束指定一個(gè)或多個(gè)列的組合的值具有惟一性焕盟,以防止在列中輸入重復(fù)的值秋秤。惟一性約束指定的列可以有NULL 屬性。由于主關(guān)鍵字值是具有惟一性的脚翘,因此主關(guān)鍵字列不能再設(shè)定惟一性約束灼卢。惟一性約束最多由16 個(gè)列組成
#定義惟一性約束的語法如下:
CONSTRAINT constraint_name
UNIQUE [CLUSTERED | NONCLUSTERED]
(column_name1[, column_name2,…,column_name16])
#l例子:
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、檢查約束
檢查約束對(duì)輸入列或整個(gè)表中的值設(shè)置檢查條件来农,以限制輸入值鞋真,保證數(shù)據(jù)庫的數(shù)據(jù)完整性狱窘】备撸可以對(duì)每個(gè)列設(shè)置復(fù)合檢查。
#定義檢查約束的語法如下:
CONSTRAINT constraint_name
CHECK [NOT FOR REPLICATION]
(logical_expression)
#各參數(shù)說明如下:
NOT FOR REPLICATION
指定檢查約束在把從其它表中復(fù)制的數(shù)據(jù)插入到表中時(shí)不發(fā)生作用级野。
logical_expression
指定邏輯條件表達(dá)式返回值為TRUE 或FALSE繁莹。
#例子:
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ì)算列不能作除檢查約束外的任何約束檩互。
5、缺省約束
缺省約束通過定義列的缺省值或使用數(shù)據(jù)庫的缺省值對(duì)象綁定表的列咨演,來指定列的缺省值闸昨。SQL Server 推薦使用缺省約束,而不使用定義缺省值的方式來指定列的缺省值薄风。
#定義缺省約束的語法如下:
CONSTRAINT constraint_name
DEFAULT constant_expression [FOR column_name]
#例子:
CREATE TABLE [dbo].[Students](
[Id] [int] NOT NULL,
[Name] [nchar](10) NULL,
[Age] [int]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Students] ADD DEFAULT ('未知') FOR [Name]
GO
1 alter table [dbo].[Students] add Sex char(2) default '男'
2
3 alter table [dbo].[Students] add constraint DF_age_Students default(20) for age
6饵较、列約束和表約束
對(duì)于數(shù)據(jù)庫來說,約束又分為列約束(Column Constraint)和表約束(Table Constraint)遭赂。
列約束作為列定義的一部分只作用于此列本身告抄。表約束作為表定義的一部分,可以作用于
多個(gè)列嵌牺。
由上圖可知,1龄糊,主鍵逆粹、外鍵、唯一炫惩、檢查這四項(xiàng)僻弹,既可以創(chuàng)建列約束,也可以創(chuàng)建表約束他嚷。而缺省 和 非空只能創(chuàng)建列約束蹋绽。
例子:
create table productsss (
p_id char(8) ,
p_name char(10) ,
price money default 0.01 ,
quantity smallint check (quantity>=10) , /* 列約束 */
constraint pk_p_id_name primary key (p_id, p_name) /* 表約束 */
)
7芭毙、關(guān)于約束的其他操作
#刪除約束
ALTER TABLE employees DROP CONSTRAINT emp_manager_fk;
#關(guān)閉約束
ALTER TABLE employees DISABLE CONSTRAINT emp_emp_id_pk CASCADE; //如果沒有被引用則不需CASCADE關(guān)鍵字
#打開約束
ALTER TABLE employees
ENABLE CONSTRAINT emp_emp_id_pk; //注意,打開一個(gè)先前關(guān)閉的被引用的主鍵約束,并不能自動(dòng)打開相關(guān)的外部鍵約束
注:
1. 添加主鍵約束會(huì)自動(dòng)創(chuàng)建唯一索引。如果表中尚未創(chuàng)建 聚焦索引卸耘,則自動(dòng)創(chuàng)建聚焦唯一索引退敦。如果表中已存在聚焦索引,則自動(dòng)創(chuàng)建非聚焦索引蚣抗。
2. 添加唯一約束會(huì)自動(dòng)創(chuàng)建唯一索引侈百。如果未在unique關(guān)鍵字后加上[nonclustered|c(diǎn)lustered],則默認(rèn)會(huì)創(chuàng)建非聚焦索引。