數據庫探索之旅——完整性約束條件

目錄

  1. 何為完整性約束條件
    1.1 列級約束條件
    1.2 表級約束條件
    1.3 語法格式
  2. 主鍵(PRIMARY KEY)約束
  3. 唯一性(UNIQUE)約束
  4. 空與非空(NULL/NOT NULL)約束
  5. 默認值(DEFAULT)約束
  6. 檢查(CHECK)約束
  7. 外鍵(FOREIGN)約束
  8. 自動增長標識(IDENTITY)約束

這篇文章只涉及完整性約束條件的一些概念性內容,不包含操作實例。

1. 何為完整性約束條件

約束是 SQL Server 強制執行的應用規則,建立和使用約束條件的目的是保證數據的完整性。約束能夠限制用戶存放到表中的數據的格式和可能值,他作為數據庫定義的一部分,在建表時聲明。

約束獨立于表結構,可以在不改變基本表的情況下添加和刪除。在表被刪除時,該表中的約束條件也會相應地被刪除。

基本表的完整性約束可以分為列級約束條件表級約束條件。

1.1 列級約束條件

列級約束條件是對某一個特定列的約束,包含在列定義中,可以跟在該列的其他定義之后,用空格分隔,不必指定列名。

1.2 表級約束條件

表級約束條件與列定義相互獨立,不包含在列定義中,通常用于對兩個或兩個以上的列一起進行約束。通常在所有列定義完成之后聲明。

1.3 語法格式

完整性約束的基本語法格式為:
[ CONSTRAINT < 約束名 > ] < 約束類型 >
其中約束名是用戶自定義的名稱,要求在同一個數據庫中約束名不能夠重復。如果用戶沒有定義約束名,則由數據庫系統給定一個不重復的約束名。

2. 主鍵(PRIMARY KEY)約束

主鍵是用能夠唯一表示表中的每一行的一列或一組列,這一列的數據或一組列的組合中的數據不會出現重復,且不為空。但是當主鍵為一組列時,某一列中的數據可以出現重復,或出現空值。

一個表中只能存在最多一個主鍵約束,通過他可以強制表的實體完整性。如果主鍵是只有一個列,則使用為列級約束條件;如果主鍵是由一組列組成,則使用表級約束條件。

如果為表指定了主鍵約束,數據庫引擎將通過為主鍵創建唯一索引來強制數據的唯一性。當在查詢中使用主鍵時,此索引還允許對數據進行快速訪問

3. 唯一性(UNIQUE)約束

唯一性約束能夠確保多列或多列的組合數據的唯一性。唯一性約束指定的列可以有空值,但只允許出現一個。因為主鍵的值也是具有唯一性的,所以主鍵列不能再設唯一性約束。如果只設定一個列的唯一性,則使用為列級約束條件;如果設定多列的組合的唯一性,則使用表級約束條件。

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

  1. 定位不同。主鍵約束是用來唯一標識表中的每一個行,使得表中的每一行都是可區分的。唯一性約束是用于使一列或多列的組合中的數據不出現重復。
  2. 可設的數量不同。一個表中只能設一個主鍵約束,但可以設多個唯一性約束。
  3. 可取值不同。主鍵不能取空值,但唯一性約束的列可以取一個空值。

4. 空與非空(NULL/NOT NULL)約束

空與非空約束只能用于列級約束,如果某列沒有指定 NOT NULL 約束是,系統會默認為 NULL。NULL 值不是 0 ,也不是空白,更不是填入字符串 “ NULL ”,而是表示 “ 不知道 ” 、“ 不清楚 ” 、“ 不確定 ” 或 “ 沒有數據 ” 的意思,不占任何內存空間。
將字段設置為 NOT NULL 有助于維護數據的完整性,因為這樣就可以確保行中的列永遠包含數據。

注意以下幾點:

  1. 用NULL約束的列接受用戶顯式輸入NULL,不論該列是何種數據類型,或者有默認值與之聯系。但不能輸入 ‘NULL’,否則會被認為是字符串 NULL ,而不是空值。
    2.在一個已有行數據的表中,插入列時,該列應該設為 NULL 約束,因為插入列是,該列所有數據為空,如果為 NOT NULL 約束則會報錯。
  2. 如果某列為 NOT NULL ,在插入一行數據時,必須在該列輸入一個值,否則數據庫將不接受該表行。

5. 默認值(DEFAULT)約束

默認值約束用于在表中插入一行時,在某列沒有數據,如果該列設置了默認值約束,則會自動為該字段默認一個值。

注意:

  1. 默認值約束定義的默認值僅在執行 INSERT 操作插入數據是有效。
  2. 一列最多有一個默認值,其中包括 NULL 值。
  3. 具有 IDENTITY 屬性或 timestamp 數據類型屬性的列不能使用數據值,text 和image 類型的列只能以 NULL 為默認值。

6. 檢查(CHECK)約束

檢查約束用來檢查用戶輸入數據的取值是否正確,只有符合約束條件的數據才能輸入。在一個表中可以創建多個檢查約束,在一個列上也可以創建多個檢查約束,只要他們不矛盾。檢查約束可以是列級的,也可以是表級的。

7. 外鍵(FOREIGN KEY)約束

在表 A 中的一列或多列的組合不是表 A 的主鍵,而是另一個表表 B 的主鍵,那么這一列或多列的組合就是表 A 的外鍵。

外鍵約束保證了數據庫各個表中數據的一致性和正確性。外鍵約束既可以是列級約束條件,也可以是表級約束條件。

8. 自動增長標識(IDENTITY)約束

SQL Server 為自動進行順序編號引入了自定編號的 IDENTITY 屬性,具有 IDENTITY 屬性的列稱為標識列,其取值稱為標識值。

IDENTITY 屬性具有一下特點:

  1. IDENTITY 列的數據類型只能為 tinyint、samllint、int、bigint、numeric和decimal。當為numeric 和 decimal 類型是,不允許有小數位。
  2. 當用戶在表中插入一行新的記錄時,不必也不能向據有 IDENTITY 屬性的列輸入數據,系統將自動在該列添加一個規定間隔遞增或遞減的數據。
  3. 每個表最多有個一個列具有 IDENTITY 屬性,且該列不能為空,不允許據有默認值,也不能由用戶更新。

IDENTITY 的語法為:
IDENTITY [ (seed , increment) ]

其中 seed 表示加載到表中的第一個行所使用的值,increment 表示與前一個加載的行的標識值相加的增量值。使用 IDENTITY 屬性時,必須同時指定種子和增量,或者二者都不指定,取默認值 (1 , 1) 。


以往的文章:
數據庫探索之旅——初識數據庫
數據庫探索之旅——數據庫管理系統
數據庫探索之旅——連接數據庫
數據庫探索之旅——對數據庫的簡單操作
數據庫探索之旅——數據類型

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容