數(shù)據(jù)完整性測(cè)試
一、概述
數(shù)據(jù)的完整性,是指存儲(chǔ)在數(shù)據(jù)庫中的數(shù)據(jù)的正確性和可靠性,它是衡量數(shù)據(jù)中數(shù)據(jù)質(zhì)量的一種標(biāo)準(zhǔn)。數(shù)據(jù)完整性可以分為四類。
1、實(shí)體完整性,實(shí)體完整性的目的是確保數(shù)據(jù)庫中所有實(shí)體的唯一性,也就是不應(yīng)出現(xiàn)完全相同的數(shù)據(jù)記錄。
2、區(qū)域完整性,匹配完整性要求數(shù)據(jù)表中的數(shù)據(jù)位于某一個(gè)特定的允許范圍內(nèi)。
3、參考完整性,是用來維護(hù)相關(guān)數(shù)據(jù)表之間數(shù)據(jù)一致性的手段,通過實(shí)現(xiàn)參考完整性,可以避免因一個(gè)數(shù)據(jù)表的記錄改變而造成另一個(gè)數(shù)據(jù)表內(nèi)的數(shù)據(jù)變成無效值。
4、用戶自定義完整性,用戶自定義由用戶根據(jù)實(shí)際應(yīng)用中的需要自行定義。
二、利用約束維護(hù)數(shù)據(jù)完整性
第一種:字段級(jí)約束,只能作用于一個(gè)字段。
第二種:數(shù)據(jù)級(jí)的約束;分為:
1、主鍵約束,使用數(shù)據(jù)表中的一列數(shù)據(jù)或多列數(shù)據(jù)來唯一標(biāo)識(shí)一行數(shù)據(jù)。在數(shù)據(jù)表中不能存在主鍵相同的兩行數(shù)據(jù),主鍵不能為NULL。
2、外鍵約束,主要用來實(shí)現(xiàn)數(shù)據(jù)的區(qū)域完整性和引用完整性。如果確定了數(shù)據(jù)表中某一個(gè)字段將作為該數(shù)據(jù)表與其他數(shù)據(jù)表關(guān)聯(lián)時(shí)使用的外鍵,則該字段的聚會(huì)范圍將決定于關(guān)聯(lián)數(shù)據(jù)表中該字段的取值范圍。外鍵可以與另一張表上的主鍵約束建立聯(lián)系,也可以與另一張表上的唯一約束建立聯(lián)系。當(dāng)一行新的數(shù)據(jù)被加入到表中,或?qū)Ρ碇幸呀?jīng)存在的外鍵上的數(shù)據(jù)進(jìn)行修改時(shí),新的數(shù)據(jù)必須存在于另一張表的主鍵上,或者為NULL。
3、唯一約束,主要用來確保非主鍵字段中的唯一性。唯一約束可以用來同時(shí)約束一個(gè)或多個(gè)非主鍵字段中數(shù)據(jù)的唯一性,而主鍵約束只允許一個(gè)字段數(shù)據(jù)的唯一性或多個(gè)字段組合在一起的唯一性;使用唯一約束的字段中允許出現(xiàn)NULL值,而在使用主鍵約束時(shí),字段中不允許出現(xiàn)NULL值。
4、檢查(CHECK)約束,檢查約束通過檢查輸入數(shù)據(jù)字段值來維護(hù)數(shù)據(jù)的完整性,以確保只有符合條件的數(shù)據(jù)才能夠進(jìn)入數(shù)據(jù)表。它通常是通過一個(gè)邏輯表達(dá)式的結(jié)果是否為真來判斷是否符合條件。與外鍵約束不同,外鍵約束是從另一張表上獲得合理的數(shù)據(jù),而檢查約束則是通過對(duì)一個(gè)表達(dá)式的結(jié)果進(jìn)行判斷來對(duì)數(shù)據(jù)進(jìn)行檢查。
三、利用規(guī)則維護(hù)數(shù)據(jù)完整性
規(guī)則限制了可以存儲(chǔ)在表中或用戶定義數(shù)據(jù)類型的值,它可以使用多種方式 來完成對(duì)數(shù)據(jù)值的檢驗(yàn),可以使用函數(shù)返回驗(yàn)證信息,也可以使用關(guān)鍵字BETWEEN, LIKE, IN完成對(duì)輸入數(shù)據(jù)的檢查。
規(guī)則是數(shù)據(jù)庫對(duì)象之一,它的作用與CHECK約束的部分功能相同,在向表的某列插入或更新數(shù)據(jù)時(shí),用它來限制輸入的新值的取值范圍,但規(guī)則作為單獨(dú)的數(shù)據(jù)庫對(duì)象來實(shí)現(xiàn),在一列上只能使用一個(gè)規(guī)則卻可以使用多個(gè)CHECK,另外,規(guī)則可以應(yīng)用于多個(gè)示例,還可以應(yīng)用于用戶自定義的數(shù)據(jù)類型,而CHECK只能應(yīng)用于它定義的列。
規(guī)則是實(shí)現(xiàn)區(qū)域完整性的方法之一,當(dāng)數(shù)據(jù)庫中的數(shù)據(jù)被插入或更新時(shí),需要檢查這個(gè)新值是否遵循規(guī)則,如果違反了規(guī)則,則操作失敗。
1、DEFAULT對(duì)象(數(shù)據(jù)庫對(duì)象),可以實(shí)現(xiàn)數(shù)據(jù)完整性,綁定到列或用戶自定義數(shù)據(jù)類型時(shí),如果插入時(shí)沒有明確提供值,默認(rèn)值便指定一個(gè)值,并將其插入到對(duì)象所綁定的列中。
2、RULES對(duì)象(數(shù)據(jù)庫對(duì)象),可以用它來實(shí)現(xiàn)數(shù)據(jù)完整性,當(dāng)綁定到列或用戶自定義數(shù)據(jù)類型時(shí),規(guī)則將指定可以插入到列中的可接受的值。
四、使用觸發(fā)器和存儲(chǔ)過程實(shí)現(xiàn)數(shù)據(jù)完整性
觸發(fā)器是一種特殊的存儲(chǔ)過程,它不能被顯示地調(diào)用,而是在向表中插入、更新或刪除數(shù)據(jù)時(shí)被自動(dòng)激活。所以,觸發(fā)器可以用來對(duì)表實(shí)施復(fù)雜的完整性約束,當(dāng)觸發(fā)器所的數(shù)據(jù)發(fā)生改變時(shí),觸發(fā)器會(huì)自動(dòng)被激活,從而防止對(duì)數(shù)據(jù)的不正確修改。
觸發(fā)器與數(shù)據(jù)表緊密相連,可以看作是數(shù)據(jù)表定義的一部分,能學(xué)它們都是以一組SQL語句的形式存在。觸發(fā)器基于一個(gè)表創(chuàng)建,介是可以針對(duì)多個(gè)表進(jìn)行操作。觸發(fā)器可以實(shí)現(xiàn)所有的約束功能。觸發(fā)器可以引用其他表中的列。
觸發(fā)器可以評(píng)估數(shù)據(jù)修改前后的表狀態(tài),并根據(jù)其差異采取對(duì)策,這也是約束無法實(shí)現(xiàn)的。
觸發(fā)器為系統(tǒng)自動(dòng)觸發(fā),而存儲(chǔ)過程則需要強(qiáng)制激活。
五、總結(jié)
1、使用約束的系統(tǒng)開銷最低,其次為使用默認(rèn)值和規(guī)則,開銷最高的是脆性器和存儲(chǔ)過程;
2、功能最強(qiáng)的是觸發(fā)器和存儲(chǔ)過程,其次是默認(rèn)值和規(guī)則,最后是使用約束;