在SQL Server中有5種限制:
主鍵限制(primary key constraint)
唯一性限制(unique constraint)
檢查限制(check constraint)
預設限制(default constraint)
外部鍵限制(foreign key constraint)
在SQL SERVER中,
(1) 對于基本表的限制分為列限制和表限制
限制是限制使用者輸入到表中的資料的值的範圍,一般分為列級限制與表級限制。
列級限制有六種:主鍵Primary key、外鍵foreign key 、唯一 unique、檢查 checck 、預設default 、非空/空值 not null/ null
表級限制有四種:主鍵、外鍵、唯一、檢查
列限制是對某一個特定列的限制,包含在列定義中,直接跟在該列的其他定義之後,用空格分隔,不必指定列名;
表限制與列定義互相獨立,不包括在列定義中,通常用于對多個列一起進行限制,與列定義用’,’分隔,定義表限制時必須指出要限制的那些列的名稱。完整性限制的基本文法格式為:
[ CONSTRAINT <限制名> ] <限制類型>
限制名:限制不指定名稱時,系統會給定一個名稱。
(2)列級限制與表級限制的差別
如果完整性限制涉及到該表的多個屬性列,必須定義在表級上,否則既可以定義在列級也可以定義在表級。
簡而言之:
列級限制:列級限制是行定義的一部分,隻能應用于一列上。
表級限制:表級限制是獨立于列的定義,可以應用在一個表中的多列上。
(3)列級限制與表級限制在SQL中的用法(即如何在SQL中定義限制)
在建立表時定義限制:
CREATE TABLE table_name
({<column_definition> -------列級限制定義
|column_name AS computed_column_expression -------計算列定義
|<teble_constraint> ------表級限制定義
}[,….n]
)
一個限制定義為列級限制還是表級限制???
根據實際需要和設計者思路确定。如primary key,當隻涉及到一列時,定義為列級限制;當涉及到多列時,則定義為表級限制。
Prinmary key定義為列級限制時,相應SQL語句:
Stu_id上建立的主鍵pk_1為列級限制
CREATE TABLE student
(Stu_id int constraint pk_1 primary key,
Stu_name varchar(8),
….)
當定義為表級限制時,相應SQL語句:
CREATE TABLE student
(Stu_id int NOT NULL,
Stu_id上建立的主鍵pk_1為的表級限制
Stu_name varchar(8),
Constraint pk_1 primary key (Stu_id),
….)
各限制具體說明:
1. 主鍵限制
PRIMARY KEY限制
PRIMARY KEY限制用于定義基本表的主鍵,起唯一辨別作用,其值不能為NULL,也不能重複,以此來保證明體的完整性。
PRIMARY KEY與UNIQUE限制類似,通過建立唯一索引來保證基本表在主鍵列取值的唯一性,但它們之間存在着很大的差別:
①在一個基本表中隻能定義一個PRIMARY KEY限制,但可定義多個UNIQUE限制;
②對于指定為PRIMARY KEY的一個列或多個列的組合,其中任何一個列都不能出現空值,而對于UNIQUE所限制的唯一鍵,則允許為空。
注意:不能為同一個列或一組列既定義UNIQUE限制,又定義PRIMARY KEY限制。
PRIMARY KEY既可用于列限制,也可用于表限制。
PRIMARY KEY用于定義列限制時,其文法格式如下:
CONSTRAINT <限制名> PRIMARY KEY
PRIMARY KEY用于定義表限制時,即将某些列的組合定義為主鍵,其文法格式如下:
[CONSTRAINT <限制名>]S PRIMARY KEY (<列名>[{<列名>}])
2. 唯一性(UNIQUE)限制
UNIQUE限制用于指明基本表在某一列或多個列的組合上的取值必須唯一。
定義了UNIQUE限制的那些列稱為唯一鍵,系統自動為唯一鍵建立唯一索引,進而保證了唯一鍵的唯一性。
唯一鍵允許為空,但系統為保證其唯一性,最多隻可以出現一個NULL值。
UNIQUE既可用于列限制,也可用于表限制。
UNIQUE用于定義列限制時,其文法格式如下:
[CONSTRAINT <限制名>] UNIQUE
唯一性限制用于指定一個或者多個列的組合的值具有唯一性,以防止在列中輸入重複的值。當使用唯一性限制時,需要考慮以下幾個因素:
①使用唯一性限制的字段允許為空值。
②一個表中可以允許有多個唯一性限制。
③可以把唯一性限制定義在多個字段上。
④唯一性限制用于強制在指定字段上建立一個唯一性索引。
⑤預設情況下,建立的索引類型為非聚簇索引。
unique限制是用來確定不受主鍵限制列上的資料的唯一性.
unique與primary key的差別在于:
(1)unique限制主要用于非主鍵的一列或多列上要求資料唯一.
(2) unique限制允許該列上存在NULL值,而主鍵決不允許出現.
(3)可以在一個表建立多個unique限制,而在一個表上隻能夠設定一個主鍵
3. 檢查限制
CHECK限制用來檢查字段值所允許的範圍,如,一個字段隻能輸入整數,而且限定在0-100的整數,以此來保證域的完整性。
CHECK既可用于列限制,也可用于表限制,
其文法格式為:
[CONSTRAINT <限制名>] CHECK (<條件>)
一個列級檢查限制隻能與限制的字段有關;一個表級檢查限制隻能與限制的表中字段有關。
一個表中可以定義多個檢查限制。
每個CREATE TABLE語句中每個字段隻能定義一個檢查限制。
在多個字段上定義檢查限制,則必須将檢查限制定義為表級限制。
當執行INSERT語句或者UPDATE語句時,檢查限制将驗證資料。
檢查限制中不能包含子查詢。
4. 預設限制
使用預設限制時,應該注意以下幾點:
每個字段隻能定義一個預設限制。
如果定義的預設值長于其對應字段的允許長度,那麼輸入到表中的預設值将被截斷。
不能加入到帶有IDENTITY屬性或者資料類型為timestamp的字段上。
如果字段定義為使用者定義的資料類型,而且有一個預設綁定到這個資料類型上,則不允許該字段有預設限制。
5. 外部鍵限制
外部鍵限制用于強制參照完整性,提供單個字段或者多個字段的參照完整性。 FOREIGN KEY限制指定某一個列或一組列作為外部鍵,其中,包含外部鍵的表稱為從表(參照表),包含外部鍵所引用的主鍵或唯一鍵的表稱主表(被參照表)。
系統保證從表在外部鍵上的取值要麼是主表中某一個主鍵值或唯一鍵值,要麼取空值。以此保證兩個表之間的連接配接,確定了實體的參照完整性。
FOREIGN KEY既可用于列限制,也可用于表限制,
其文法格式為:
[CONSTRAINT <限制名>] FOREIGN KEY REFERENCES <主表名> (<列名>[{<列名>}])
當使用外部鍵限制時,應該考慮以下幾個因素:
①外部鍵限制提供了字段參照完整性。
②外部鍵從句中的字段數目和每個字段指定的資料類型必須和REFERENCES從句中的字段相比對。
③外部鍵限制不能自動建立索引,需要使用者手動建立。
④使用者想要修改外部鍵限制的資料,必須有對外部鍵限制所參考表的SELECT權限或者REFERENCES權限。
⑤參考同一表中的字段時,必須隻使用REFERENCES子句,不能使用外部鍵子句。
⑥一個表中最多可以有31個外部鍵限制。
⑦在臨時表中,不能使用外部鍵限制。
⑧主鍵和外部鍵的資料類型必須嚴格比對。
6. NULL 限制
(1)NULL/NOT NULL
是否允許該字段的值為NULL。
NULL值不是0也不是空白,更不是填入字元串“NULL”,而是表示“不知道”、“不确定”或“沒有資料”的意思。
當某一字段的值一定要輸入才有意義的時候,則可以設定為NOT NULL。
如主鍵列就不允許出現空值,否則就失去了唯一辨別一條記錄的作用
隻能用于定義列限制,
其文法格式如下:
[CONSTRAINT <限制名> ][NULL|NOT NULL]