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