目錄
- 何為完整性約束條件
1.1 列級約束條件
1.2 表級約束條件
1.3 語法格式 - 主鍵(PRIMARY KEY)約束
- 唯一性(UNIQUE)約束
- 空與非空(NULL/NOT NULL)約束
- 默認值(DEFAULT)約束
- 檢查(CHECK)約束
- 外鍵(FOREIGN)約束
- 自動增長標識(IDENTITY)約束
這篇文章只涉及完整性約束條件的一些概念性內容,不包含操作實例。
1. 何為完整性約束條件
約束是 SQL Server 強制執行的應用規則,建立和使用約束條件的目的是保證數據的完整性。約束能夠限制用戶存放到表中的數據的格式和可能值,他作為數據庫定義的一部分,在建表時聲明。
約束獨立于表結構,可以在不改變基本表的情況下添加和刪除。在表被刪除時,該表中的約束條件也會相應地被刪除。
基本表的完整性約束可以分為列級約束條件和表級約束條件。
1.1 列級約束條件
列級約束條件是對某一個特定列的約束,包含在列定義中,可以跟在該列的其他定義之后,用空格分隔,不必指定列名。
1.2 表級約束條件
表級約束條件與列定義相互獨立,不包含在列定義中,通常用于對兩個或兩個以上的列一起進行約束。通常在所有列定義完成之后聲明。
1.3 語法格式
完整性約束的基本語法格式為:
[ CONSTRAINT < 約束名 > ] < 約束類型 >
其中約束名是用戶自定義的名稱,要求在同一個數據庫中約束名不能夠重復。如果用戶沒有定義約束名,則由數據庫系統給定一個不重復的約束名。
2. 主鍵(PRIMARY KEY)約束
主鍵是用能夠唯一表示表中的每一行的一列或一組列,這一列的數據或一組列的組合中的數據不會出現重復,且不為空。但是當主鍵為一組列時,某一列中的數據可以出現重復,或出現空值。
一個表中只能存在最多一個主鍵約束,通過他可以強制表的實體完整性。如果主鍵是只有一個列,則使用為列級約束條件;如果主鍵是由一組列組成,則使用表級約束條件。
如果為表指定了主鍵約束,數據庫引擎將通過為主鍵創建唯一索引來強制數據的唯一性。當在查詢中使用主鍵時,此索引還允許對數據進行快速訪問
3. 唯一性(UNIQUE)約束
唯一性約束能夠確保多列或多列的組合數據的唯一性。唯一性約束指定的列可以有空值,但只允許出現一個。因為主鍵的值也是具有唯一性的,所以主鍵列不能再設唯一性約束。如果只設定一個列的唯一性,則使用為列級約束條件;如果設定多列的組合的唯一性,則使用表級約束條件。
辨別:主鍵約束與唯一性約束
- 定位不同。主鍵約束是用來唯一標識表中的每一個行,使得表中的每一行都是可區分的。唯一性約束是用于使一列或多列的組合中的數據不出現重復。
- 可設的數量不同。一個表中只能設一個主鍵約束,但可以設多個唯一性約束。
- 可取值不同。主鍵不能取空值,但唯一性約束的列可以取一個空值。
4. 空與非空(NULL/NOT NULL)約束
空與非空約束只能用于列級約束,如果某列沒有指定 NOT NULL 約束是,系統會默認為 NULL。NULL 值不是 0 ,也不是空白,更不是填入字符串 “ NULL ”,而是表示 “ 不知道 ” 、“ 不清楚 ” 、“ 不確定 ” 或 “ 沒有數據 ” 的意思,不占任何內存空間。
將字段設置為 NOT NULL 有助于維護數據的完整性,因為這樣就可以確保行中的列永遠包含數據。
注意以下幾點:
- 用NULL約束的列接受用戶顯式輸入NULL,不論該列是何種數據類型,或者有默認值與之聯系。但不能輸入 ‘NULL’,否則會被認為是字符串 NULL ,而不是空值。
2.在一個已有行數據的表中,插入列時,該列應該設為 NULL 約束,因為插入列是,該列所有數據為空,如果為 NOT NULL 約束則會報錯。- 如果某列為 NOT NULL ,在插入一行數據時,必須在該列輸入一個值,否則數據庫將不接受該表行。
5. 默認值(DEFAULT)約束
默認值約束用于在表中插入一行時,在某列沒有數據,如果該列設置了默認值約束,則會自動為該字段默認一個值。
注意:
- 默認值約束定義的默認值僅在執行 INSERT 操作插入數據是有效。
- 一列最多有一個默認值,其中包括 NULL 值。
- 具有 IDENTITY 屬性或 timestamp 數據類型屬性的列不能使用數據值,text 和image 類型的列只能以 NULL 為默認值。
6. 檢查(CHECK)約束
檢查約束用來檢查用戶輸入數據的取值是否正確,只有符合約束條件的數據才能輸入。在一個表中可以創建多個檢查約束,在一個列上也可以創建多個檢查約束,只要他們不矛盾。檢查約束可以是列級的,也可以是表級的。
7. 外鍵(FOREIGN KEY)約束
在表 A 中的一列或多列的組合不是表 A 的主鍵,而是另一個表表 B 的主鍵,那么這一列或多列的組合就是表 A 的外鍵。
外鍵約束保證了數據庫各個表中數據的一致性和正確性。外鍵約束既可以是列級約束條件,也可以是表級約束條件。
8. 自動增長標識(IDENTITY)約束
SQL Server 為自動進行順序編號引入了自定編號的 IDENTITY 屬性,具有 IDENTITY 屬性的列稱為標識列,其取值稱為標識值。
IDENTITY 屬性具有一下特點:
- IDENTITY 列的數據類型只能為 tinyint、samllint、int、bigint、numeric和decimal。當為numeric 和 decimal 類型是,不允許有小數位。
- 當用戶在表中插入一行新的記錄時,不必也不能向據有 IDENTITY 屬性的列輸入數據,系統將自動在該列添加一個規定間隔遞增或遞減的數據。
- 每個表最多有個一個列具有 IDENTITY 屬性,且該列不能為空,不允許據有默認值,也不能由用戶更新。
IDENTITY 的語法為:
IDENTITY [ (seed , increment) ]
其中 seed 表示加載到表中的第一個行所使用的值,increment 表示與前一個加載的行的標識值相加的增量值。使用 IDENTITY 屬性時,必須同時指定種子和增量,或者二者都不指定,取默認值 (1 , 1) 。
以往的文章:
數據庫探索之旅——初識數據庫
數據庫探索之旅——數據庫管理系統
數據庫探索之旅——連接數據庫
數據庫探索之旅——對數據庫的簡單操作
數據庫探索之旅——數據類型