【SQL】數(shù)據(jù)庫中的五種約束

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è)列嵌牺。

image

由上圖可知,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)建非聚焦索引。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末翰铡,一起剝皮案震驚了整個(gè)濱河市钝域,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锭魔,老刑警劉巖例证,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異迷捧,居然都是意外死亡织咧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門党涕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烦感,“玉大人,你說我怎么就攤上這事膛堤∈秩ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵肥荔,是天一觀的道長绿渣。 經(jīng)常有香客問我,道長燕耿,這世上最難降的妖魔是什么中符? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮誉帅,結(jié)果婚禮上淀散,老公的妹妹穿的比我還像新娘。我一直安慰自己蚜锨,他們只是感情好档插,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著亚再,像睡著了一般郭膛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氛悬,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天则剃,我揣著相機(jī)與錄音耘柱,去河邊找鬼。 笑死棍现,一個(gè)胖子當(dāng)著我的面吹牛调煎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播轴咱,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼汛蝙,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了朴肺?” 一聲冷哼從身側(cè)響起窖剑,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎戈稿,沒想到半個(gè)月后西土,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鞍盗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年需了,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片般甲。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肋乍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出敷存,到底是詐尸還是另有隱情墓造,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布锚烦,位于F島的核電站觅闽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏涮俄。R本人自食惡果不足惜蛉拙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望彻亲。 院中可真熱鬧孕锄,春花似錦、人聲如沸苞尝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽野来。三九已至,卻和暖如春踪旷,著一層夾襖步出監(jiān)牢的瞬間曼氛,已是汗流浹背豁辉。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舀患,地道東北人徽级。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像聊浅,于是被迫代替她去往敵國和親餐抢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容