目錄
- 何為完整性約束條件
1.1 列級(jí)約束條件
1.2 表級(jí)約束條件
1.3 語(yǔ)法格式 - 主鍵(PRIMARY KEY)約束
- 唯一性(UNIQUE)約束
- 空與非空(NULL/NOT NULL)約束
- 默認(rèn)值(DEFAULT)約束
- 檢查(CHECK)約束
- 外鍵(FOREIGN)約束
- 自動(dòng)增長(zhǎng)標(biāo)識(shí)(IDENTITY)約束
這篇文章只涉及完整性約束條件的一些概念性內(nèi)容,不包含操作實(shí)例寡壮。
1. 何為完整性約束條件
約束是 SQL Server 強(qiáng)制執(zhí)行的應(yīng)用規(guī)則憔四,建立和使用約束條件的目的是保證數(shù)據(jù)的完整性人乓。約束能夠限制用戶存放到表中的數(shù)據(jù)的格式和可能值尚辑,他作為數(shù)據(jù)庫(kù)定義的一部分,在建表時(shí)聲明懈糯。
約束獨(dú)立于表結(jié)構(gòu)奢方,可以在不改變基本表的情況下添加和刪除。在表被刪除時(shí)渣触,該表中的約束條件也會(huì)相應(yīng)地被刪除羡棵。
基本表的完整性約束可以分為列級(jí)約束條件和表級(jí)約束條件。
1.1 列級(jí)約束條件
列級(jí)約束條件是對(duì)某一個(gè)特定列的約束嗅钻,包含在列定義中皂冰,可以跟在該列的其他定義之后,用空格分隔养篓,不必指定列名秃流。
1.2 表級(jí)約束條件
表級(jí)約束條件與列定義相互獨(dú)立,不包含在列定義中柳弄,通常用于對(duì)兩個(gè)或兩個(gè)以上的列一起進(jìn)行約束舶胀。通常在所有列定義完成之后聲明。
1.3 語(yǔ)法格式
完整性約束的基本語(yǔ)法格式為:
[ CONSTRAINT < 約束名 > ] < 約束類型 >
其中約束名是用戶自定義的名稱语御,要求在同一個(gè)數(shù)據(jù)庫(kù)中約束名不能夠重復(fù)峻贮。如果用戶沒(méi)有定義約束名,則由數(shù)據(jù)庫(kù)系統(tǒng)給定一個(gè)不重復(fù)的約束名应闯。
2. 主鍵(PRIMARY KEY)約束
主鍵是用能夠唯一表示表中的每一行的一列或一組列纤控,這一列的數(shù)據(jù)或一組列的組合中的數(shù)據(jù)不會(huì)出現(xiàn)重復(fù),且不為空碉纺。但是當(dāng)主鍵為一組列時(shí)船万,某一列中的數(shù)據(jù)可以出現(xiàn)重復(fù)刻撒,或出現(xiàn)空值。
一個(gè)表中只能存在最多一個(gè)主鍵約束耿导,通過(guò)他可以強(qiáng)制表的實(shí)體完整性声怔。如果主鍵是只有一個(gè)列,則使用為列級(jí)約束條件舱呻;如果主鍵是由一組列組成醋火,則使用表級(jí)約束條件。
如果為表指定了主鍵約束箱吕,數(shù)據(jù)庫(kù)引擎將通過(guò)為主鍵創(chuàng)建唯一索引來(lái)強(qiáng)制數(shù)據(jù)的唯一性芥驳。當(dāng)在查詢中使用主鍵時(shí),此索引還允許對(duì)數(shù)據(jù)進(jìn)行快速訪問(wèn)
3. 唯一性(UNIQUE)約束
唯一性約束能夠確保多列或多列的組合數(shù)據(jù)的唯一性茬高。唯一性約束指定的列可以有空值兆旬,但只允許出現(xiàn)一個(gè)。因?yàn)橹麈I的值也是具有唯一性的怎栽,所以主鍵列不能再設(shè)唯一性約束丽猬。如果只設(shè)定一個(gè)列的唯一性,則使用為列級(jí)約束條件熏瞄;如果設(shè)定多列的組合的唯一性脚祟,則使用表級(jí)約束條件。
辨別:主鍵約束與唯一性約束
- 定位不同巴刻。主鍵約束是用來(lái)唯一標(biāo)識(shí)表中的每一個(gè)行愚铡,使得表中的每一行都是可區(qū)分的。唯一性約束是用于使一列或多列的組合中的數(shù)據(jù)不出現(xiàn)重復(fù)胡陪。
- 可設(shè)的數(shù)量不同沥寥。一個(gè)表中只能設(shè)一個(gè)主鍵約束,但可以設(shè)多個(gè)唯一性約束柠座。
- 可取值不同邑雅。主鍵不能取空值,但唯一性約束的列可以取一個(gè)空值妈经。
4. 空與非空(NULL/NOT NULL)約束
空與非空約束只能用于列級(jí)約束淮野,如果某列沒(méi)有指定 NOT NULL 約束是,系統(tǒng)會(huì)默認(rèn)為 NULL吹泡。NULL 值不是 0 骤星,也不是空白,更不是填入字符串 “ NULL ”爆哑,而是表示 “ 不知道 ” 洞难、“ 不清楚 ” 、“ 不確定 ” 或 “ 沒(méi)有數(shù)據(jù) ” 的意思揭朝,不占任何內(nèi)存空間队贱。
將字段設(shè)置為 NOT NULL 有助于維護(hù)數(shù)據(jù)的完整性色冀,因?yàn)檫@樣就可以確保行中的列永遠(yuǎn)包含數(shù)據(jù)。
注意以下幾點(diǎn):
- 用NULL約束的列接受用戶顯式輸入NULL柱嫌,不論該列是何種數(shù)據(jù)類型锋恬,或者有默認(rèn)值與之聯(lián)系。但不能輸入 ‘NULL’编丘,否則會(huì)被認(rèn)為是字符串 NULL 与学,而不是空值。
2.在一個(gè)已有行數(shù)據(jù)的表中瘪吏,插入列時(shí)癣防,該列應(yīng)該設(shè)為 NULL 約束蜗巧,因?yàn)椴迦肓惺钦泼撸摿兴袛?shù)據(jù)為空,如果為 NOT NULL 約束則會(huì)報(bào)錯(cuò)幕屹。- 如果某列為 NOT NULL 蓝丙,在插入一行數(shù)據(jù)時(shí),必須在該列輸入一個(gè)值望拖,否則數(shù)據(jù)庫(kù)將不接受該表行渺尘。
5. 默認(rèn)值(DEFAULT)約束
默認(rèn)值約束用于在表中插入一行時(shí),在某列沒(méi)有數(shù)據(jù)说敏,如果該列設(shè)置了默認(rèn)值約束鸥跟,則會(huì)自動(dòng)為該字段默認(rèn)一個(gè)值。
注意:
- 默認(rèn)值約束定義的默認(rèn)值僅在執(zhí)行 INSERT 操作插入數(shù)據(jù)是有效盔沫。
- 一列最多有一個(gè)默認(rèn)值医咨,其中包括 NULL 值。
- 具有 IDENTITY 屬性或 timestamp 數(shù)據(jù)類型屬性的列不能使用數(shù)據(jù)值架诞,text 和image 類型的列只能以 NULL 為默認(rèn)值拟淮。
6. 檢查(CHECK)約束
檢查約束用來(lái)檢查用戶輸入數(shù)據(jù)的取值是否正確,只有符合約束條件的數(shù)據(jù)才能輸入谴忧。在一個(gè)表中可以創(chuàng)建多個(gè)檢查約束很泊,在一個(gè)列上也可以創(chuàng)建多個(gè)檢查約束,只要他們不矛盾沾谓。檢查約束可以是列級(jí)的委造,也可以是表級(jí)的。
7. 外鍵(FOREIGN KEY)約束
在表 A 中的一列或多列的組合不是表 A 的主鍵均驶,而是另一個(gè)表表 B 的主鍵昏兆,那么這一列或多列的組合就是表 A 的外鍵。
外鍵約束保證了數(shù)據(jù)庫(kù)各個(gè)表中數(shù)據(jù)的一致性和正確性辣恋。外鍵約束既可以是列級(jí)約束條件亮垫,也可以是表級(jí)約束條件模软。
8. 自動(dòng)增長(zhǎng)標(biāo)識(shí)(IDENTITY)約束
SQL Server 為自動(dòng)進(jìn)行順序編號(hào)引入了自定編號(hào)的 IDENTITY 屬性,具有 IDENTITY 屬性的列稱為標(biāo)識(shí)列饮潦,其取值稱為標(biāo)識(shí)值燃异。
IDENTITY 屬性具有一下特點(diǎn):
- IDENTITY 列的數(shù)據(jù)類型只能為 tinyint、samllint继蜡、int回俐、bigint、numeric和decimal稀并。當(dāng)為numeric 和 decimal 類型是仅颇,不允許有小數(shù)位。
- 當(dāng)用戶在表中插入一行新的記錄時(shí)碘举,不必也不能向據(jù)有 IDENTITY 屬性的列輸入數(shù)據(jù)忘瓦,系統(tǒng)將自動(dòng)在該列添加一個(gè)規(guī)定間隔遞增或遞減的數(shù)據(jù)。
- 每個(gè)表最多有個(gè)一個(gè)列具有 IDENTITY 屬性引颈,且該列不能為空耕皮,不允許據(jù)有默認(rèn)值,也不能由用戶更新蝙场。
IDENTITY 的語(yǔ)法為:
IDENTITY [ (seed , increment) ]
其中 seed 表示加載到表中的第一個(gè)行所使用的值凌停,increment 表示與前一個(gè)加載的行的標(biāo)識(shí)值相加的增量值。使用 IDENTITY 屬性時(shí)售滤,必須同時(shí)指定種子和增量罚拟,或者二者都不指定,取默認(rèn)值 (1 , 1) 完箩。
以往的文章:
數(shù)據(jù)庫(kù)探索之旅——初識(shí)數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)探索之旅——數(shù)據(jù)庫(kù)管理系統(tǒng)
數(shù)據(jù)庫(kù)探索之旅——連接數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)探索之旅——對(duì)數(shù)據(jù)庫(kù)的簡(jiǎn)單操作
數(shù)據(jù)庫(kù)探索之旅——數(shù)據(jù)類型