1. 程式人生 > >sql中表級約束和列級約束

sql中表級約束和列級約束

server sel 檢查 href foreign 設置 截斷 eat mes

sql中表級約束和列級約束,在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]

sql中表級約束和列級約束