數(shù)據(jù)庫(kù)探索之旅——完整性約束條件

目錄

  1. 何為完整性約束條件
    1.1 列級(jí)約束條件
    1.2 表級(jí)約束條件
    1.3 語(yǔ)法格式
  2. 主鍵(PRIMARY KEY)約束
  3. 唯一性(UNIQUE)約束
  4. 空與非空(NULL/NOT NULL)約束
  5. 默認(rèn)值(DEFAULT)約束
  6. 檢查(CHECK)約束
  7. 外鍵(FOREIGN)約束
  8. 自動(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í)約束條件。

辨別:主鍵約束與唯一性約束

  1. 定位不同巴刻。主鍵約束是用來(lái)唯一標(biāo)識(shí)表中的每一個(gè)行愚铡,使得表中的每一行都是可區(qū)分的。唯一性約束是用于使一列或多列的組合中的數(shù)據(jù)不出現(xiàn)重復(fù)胡陪。
  2. 可設(shè)的數(shù)量不同沥寥。一個(gè)表中只能設(shè)一個(gè)主鍵約束,但可以設(shè)多個(gè)唯一性約束柠座。
  3. 可取值不同邑雅。主鍵不能取空值,但唯一性約束的列可以取一個(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):

  1. 用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ò)幕屹。
  2. 如果某列為 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è)值。

注意:

  1. 默認(rèn)值約束定義的默認(rèn)值僅在執(zhí)行 INSERT 操作插入數(shù)據(jù)是有效盔沫。
  2. 一列最多有一個(gè)默認(rèn)值医咨,其中包括 NULL 值。
  3. 具有 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):

  1. IDENTITY 列的數(shù)據(jù)類型只能為 tinyint、samllint继蜡、int回俐、bigint、numeric和decimal稀并。當(dāng)為numeric 和 decimal 類型是仅颇,不允許有小數(shù)位。
  2. 當(dāng)用戶在表中插入一行新的記錄時(shí)碘举,不必也不能向據(jù)有 IDENTITY 屬性的列輸入數(shù)據(jù)忘瓦,系統(tǒng)將自動(dòng)在該列添加一個(gè)規(guī)定間隔遞增或遞減的數(shù)據(jù)。
  3. 每個(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ù)類型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赐俗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嗜憔,更是在濱河造成了極大的恐慌秃励,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吉捶,死亡現(xiàn)場(chǎng)離奇詭異夺鲜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)呐舔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)币励,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人珊拼,你說(shuō)我怎么就攤上這事食呻。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵仅胞,是天一觀的道長(zhǎng)每辟。 經(jīng)常有香客問(wèn)我,道長(zhǎng)干旧,這世上最難降的妖魔是什么渠欺? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮椎眯,結(jié)果婚禮上挠将,老公的妹妹穿的比我還像新娘。我一直安慰自己编整,他們只是感情好舔稀,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著掌测,像睡著了一般内贮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赏半,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天贺归,我揣著相機(jī)與錄音,去河邊找鬼断箫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛秋冰,可吹牛的內(nèi)容都是我干的仲义。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼剑勾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼埃撵!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起虽另,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤暂刘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后捂刺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體谣拣,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年族展,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了森缠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仪缸,死狀恐怖贵涵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤宾茂,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布瓷马,位于F島的核電站,受9級(jí)特大地震影響跨晴,放射性物質(zhì)發(fā)生泄漏决采。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一坟奥、第九天 我趴在偏房一處隱蔽的房頂上張望树瞭。 院中可真熱鬧,春花似錦爱谁、人聲如沸晒喷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凉敲。三九已至,卻和暖如春寺旺,著一層夾襖步出監(jiān)牢的瞬間爷抓,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工阻塑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蓝撇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓陈莽,卻偏偏與公主長(zhǎng)得像渤昌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子走搁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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