【摘要】所謂數(shù)據(jù)完整性,實(shí)際上是衡量數(shù)據(jù)庫中數(shù)據(jù)質(zhì)量好壞的一種標(biāo)志,是確保數(shù)據(jù)庫中數(shù)據(jù)一致,正確以及符合企業(yè)規(guī)則的一種思想,本文以詳細(xì)的文字來介紹了什么是數(shù)據(jù)完整性及約束,以及如何在數(shù)據(jù)庫建設(shè)中應(yīng)用和使用這些約束。
【關(guān)鍵詞】SQL Server;約束;數(shù)據(jù)完整性;一致性
在數(shù)據(jù)庫管理系統(tǒng)中,保證數(shù)據(jù)庫中的數(shù)據(jù)完整性是非常重要的。所謂數(shù)據(jù)完整性,就是指存儲在數(shù)據(jù)庫的表中數(shù)據(jù)的一致性和正確性。約束定義關(guān)于列中允許值的規(guī)則,是強(qiáng)制完整性的標(biāo)準(zhǔn)機(jī)制,對輸入數(shù)據(jù)的取值范圍和格式的限制稱為約束。約束是用來保證數(shù)據(jù)完整性的。在SQL Server中有6種常設(shè)約束:空置約束(NULL)、唯一性約束(unique constraint)、主鍵約束(primary key constraint)、外鍵約束(foreign key constraint)、檢查約束(check constraint)、缺省約束(default constraint)。
一、SQL Server的數(shù)據(jù)完整性
存儲在數(shù)據(jù)庫中的所有數(shù)據(jù)值均屬正確的狀態(tài)。如果數(shù)據(jù)庫中存儲有不正確的數(shù)據(jù)值,則該數(shù)據(jù)庫稱為已喪失數(shù)據(jù)完整性。
強(qiáng)制數(shù)據(jù)完整性可確保數(shù)據(jù)庫中的數(shù)據(jù)質(zhì)量。例如,如果有一“教學(xué)管理數(shù)據(jù)庫”,學(xué)生表中學(xué)號一項(xiàng)輸入了值為20110101的學(xué)生,那么該數(shù)據(jù)庫不應(yīng)允許其他學(xué)生使用同一學(xué)號值。如果計(jì)劃將選修表中成績的值范圍設(shè)定為0到100,則數(shù)據(jù)庫不應(yīng)接受121。如果學(xué)生表有一列為班級編碼,該列存儲的班級編碼為數(shù)據(jù)庫中允許的有效班級編碼。
二、數(shù)據(jù)完整性分類
在SQL Server中,根據(jù)數(shù)據(jù)完整性所作用的數(shù)據(jù)庫對象和范圍不同,可以將數(shù)據(jù)完整性分為實(shí)體完整性、域完整性、引用完整性、用戶定義完整性四種。
1、實(shí)體完整性
實(shí)體完整性,簡單來說,就是將表中的每一行看作一個實(shí)體。實(shí)體完整性要求表的標(biāo)示符列或主鍵的完整性(主鍵不能為空)??梢酝ㄟ^建立唯一索引、PRIMARY KEY約束、UNIQUE約束來實(shí)施實(shí)體完整性。
2、域完整性
域完整性是指給定列的輸入有效性。要求表中指定列的數(shù)據(jù)具有正確的數(shù)據(jù)類型、格式和有效的數(shù)據(jù)范圍。強(qiáng)制域有效性的方法有:限制類型(通過數(shù)據(jù)類型)、格式(通過CHECK約束和規(guī)則)或可能值的范圍。域完整性通過FOREIGN KEY約束、CHECK約束、DEFAULT定義、NOT NULL定義和規(guī)則來實(shí)現(xiàn)。
3、引用完整性
引用完整性又稱參照完整性。引用完整性維持被參照表和參照表之間的數(shù)據(jù)一致性,主要通過主鍵(PRIMARY KEY)約束和外鍵(FOREIGN KEY)約束來實(shí)現(xiàn)。
引用完整性確保數(shù)據(jù)在所有表中一致。這樣的一致性要求不能引用不存在的值,如果鍵值更改了,那么在整個數(shù)據(jù)庫中,對該鍵值的所有引用要進(jìn)行一致的修改。在被參照表中,當(dāng)其主鍵值被其他表所參照時,該行不能被刪除也不允許改變。在參照表中,不允許參照不存在的主鍵值。
4、用戶定義完整性
用戶定義完整性使用戶能定義不屬于其它任何完整性分類的特定設(shè)置。所有的完整性類型都支持用戶定義完整性。
三、SQL Server的約束
約束作為數(shù)據(jù)庫定義的一部分在CREATE TABLE語句中聲明,所以又稱做聲明完整性約束。也可以在可視化操作界面,如sqlserver2005的ssms中操作設(shè)置。約束獨(dú)立于表結(jié)構(gòu),可以在不改變表結(jié)構(gòu)情況下,通過ALTER TABLE語句來添加或者刪除。在刪除一個表時,該表所帶的所有約束定義也被隨之刪除。
1、空置約束
格式:1/not 1。
空置約束,是否允許該字段的值為NULL。當(dāng)某一字段的值一定要輸入才有意義的時候,則可以設(shè)置為NOT NULL。例如主鍵列就不允許出現(xiàn)空值,否則就失去了唯一標(biāo)識一條記錄的作用。
2、唯一約束(UNIQUE約束)
格式:[CONSTRAINT <約束名>] UNIQUE。
UNIQUE約束用于指明基本表在某一列或多個列的組合上的取值必須唯一。定義了UNIQUE約束的那些列稱為唯一鍵,系統(tǒng)自動為唯一鍵建立唯一索引。從而保證了唯一鍵的唯一性。唯一鍵允許為空,但系統(tǒng)為保證其唯一性,最多只可以出現(xiàn)一個NULL值。
3、主鍵約束(PRIMARY KEY約束)
格式:[CONSTRAINT <約束名>] PRIMARY KEY。
PRIMARY KEY約束,PRIMARY KEY約束用于定義基本表的主鍵,起唯一標(biāo)識作用,其值不能為NULL,也不能重復(fù),以此來保證實(shí)體的完整性。
PRIMARY KEY與UNIQUE約束類似,通過建立唯一索引來保證基本表在主鍵列取值的唯一性,但它們之間存在著很大的區(qū)別:
①在一個基本表中只能定義一個PRIMARY KEY約束,但可定義多個UNIQUE約束;
②對于指定為PRIMARY KEY的一個列或多個列的組合,其中任何一個列都不能出現(xiàn)空值,而對于UNIQUE所約束的唯一鍵,則允許為空。
4、外鍵約束(FOREIGN KEY約束)
格式:REFERENCES 主表名(主鍵名)。
FOREIGN KEY約束要用到兩個表一個從表,一個主表,包含外部鍵的表稱為從表,包含外部鍵所引用的主鍵或唯一鍵的表稱主表。系統(tǒng)保證從表在外部鍵上的取值要么是主表中某一個主鍵值或唯一鍵值,要么取空值。以此保證兩個表之間的連接,確保了實(shí)體的參照完整性。
5、檢查約束(CHECK約束)
格式:CHECK (條件表達(dá)式)。
CHECK約束用來檢查字段值所允許的范圍,如一個字段只能輸入整數(shù),而且限定在0-100的整數(shù),以此來保證域的完整性。
6、默認(rèn)值約束
格式:DEFAULT 默認(rèn)值。
當(dāng)為一列的約束設(shè)的是默認(rèn)值約束。那么當(dāng)用戶在插入記錄是沒有明確地提供值時,系統(tǒng)便自動將默認(rèn)值賦予給該列。
例:建立一個學(xué)生表,對性別字段進(jìn)行默認(rèn)約束。
CREATE TABLE 學(xué)生表
(學(xué)號 CHAR(7) ,
性別 CHAR(2) DEFAULT ‘男’,
……)
建立和使用約束的目的是保證數(shù)據(jù)的完整性,約束是SQL Server強(qiáng)制實(shí)行的應(yīng)用規(guī)則,使用規(guī)則能夠限制用戶存放到表中數(shù)據(jù)的格式和值的范圍,可確保數(shù)據(jù)庫中的數(shù)據(jù)質(zhì)量。