數據完整性定義:
? ??數據庫完整性(Database Integrity)是指數據庫中數據在邏輯上的一致性、正確性、有效性和相容性。數據庫完整性由各種各樣的完整性約束來保證,因此可以說數據庫完整性設計就是數據庫完整性約束的設計。數據庫完整性約束可以通過DBMS或應用程序來實現,基于DBMS的完整性約束作為模式的一部分存入數據庫中。可以理解為數據的語義正確性。
區分數據完整性和數據安全性
? ??????–數據的完整性
? ? 防止數據庫中存在不符合語義的數據,也就是防止數據庫中存在不正確的數據
? ? 防范對象:不合語義的、不正確的數據
????–數據的安全性
? ? 保護數據庫防止惡意的破壞和非法的存取
? ? 防范對象:非法用戶和非法操作
那么為了維護數據的完整性,DBMS必須做到:
1.提供定義完整性的約束條件的機制(保證數據的更新和插入符合約束,從而保證了數據完整性)
2.提供完整性檢查方法(檢查數據中是否出現了非完整性數據)
3.提供違約處理(若發現了非完整性數據要進行處理)
為什么需要數據完整性?
數據庫完整性對于數據庫應用系統非常關鍵,其作用主要體現在以下幾個方面:
1.數據庫完整性約束能夠防止合法用戶使用數據庫時向數據庫中添加不合語義的數據。
2.利用基于DBMS的完整性控制機制來實現業務規則,易于定義,容易理解,而且可以降低應用程序的復雜性,提高應用程序的運行效率。同時,基于DBMS的完整性控制機制是集中管理的,因此比應用程序更容易實現數據庫的完整性。
3.合理的數據庫完整性設計,能夠同時兼顧數據庫的完整性和系統的效能。比如裝載大量數據時,只要在裝載之前臨時使基于DBMS的數據庫完整性約束失效,此后再使其生效,就能保證既不影響數據裝載的效率又能保證數據庫的完整性。
4.在應用軟件的功能測試中,完善的數據庫完整性有助于盡早發現應用軟件的錯誤。
完整性表現
關系模型
關系完整性的用于保證數據庫中數據的正確性。系統在進行更新、插入或刪除等操作時都要檢查數據的完整性,核實其約束條件,即關系模型的完整性規則。在關系模型中有四類完整性約束:實體完整性、域完整性、參照完整性和用戶定義的完整性,其中實體完整性和參照完整性約束條件,稱為關系的兩個不變性
實體完整性? ?
(1)實體完整性(Entity Integrity)。實體完整性指表中行的完整性。主要用于保證操作的數據(記錄)非空、唯一且不重復。即實體完整性要求每個關系(表)有且僅有一個主鍵,每一個主鍵值必須唯一,而且不允許為“空”(NULL)或重復。
(2)實體完整性規則要求。若屬性A是基本關系R的主屬性,則屬性A不能取空值,即主屬性不可為空值。因為主鍵是數據庫的中某一行的唯一標志。如果主鍵取空值,關系數據庫中就會存在不可區分的實體記錄。這里NULL不是指0,而是沒有值。而對于非主鍵可以取NULL。這一規則被稱為數據庫的實體完整性要求。
? ? 實體完整性的定義:如果碼為多個列屬性,則只能定義為表級約束條件,如果碼為單個列屬性則可以定義為表級約束條件也可以定義為列級約束條件。
檢查方法:檢查主碼是否唯一,如果主碼不唯一則拒絕插入或者修改(2)檢查主碼的屬性值是否為空,如果為空則拒絕操作
參照完整性(Referential Integrity)
? ? 首先看一下什么是外碼:
????????設F是基本關系R的一個或一組屬性,但不是關系R的碼。如果F與基本關系S的主碼Ks相對應,則稱F是基本關系R的外碼。
對于參照完整性來說,屬于表間規則。對于永久關系的相關表,在更新、插入或刪除記錄時,如果只改其一,就會影響數據的完整性。如刪除父表的某記錄后,子表的相應記錄未刪除,致使這些記錄稱為孤立記錄。對于更新、插入或刪除表間數據的完整性,統稱為參照完整性。通常,在客觀現實中的實體之間存在一定聯系,在關系模型中實體及實體間的聯系都是以關系進行描述,因此,操作時就可能存在著關系與關系間的關聯和引用。在關系數據庫中,關系之間的聯系是通過公共屬性實現的。這個公共屬性經常是一個表的主鍵,同時是另一個表的外鍵。參照完整性體現在兩個方面:實現了表與表之間的聯系,外鍵的取值必須是另一個表的主鍵的有效值,或是“空”值。
? ? 定義:在CREATE TABLE 中用FOREIGN KEY短語來定義那些列是外碼,用REFERENCES指示這些外碼參考了哪些列的主碼。? ?
? ? FOREIGN KEY(NAME) REFERENCES? TABLE_NAME(NAME)
? ? 可能破壞參照完整性的情況
參照完整性的違約處理:
? ? 1)拒絕執行(NO ACTION):既然你違規了,我拒絕。
? ? 2)級聯操作(CASCADE):有時候拒絕執行是不對的,比如說,我想在想給某個班換個班主任,那么我需要將班級和人員管理級聯修改。
? ? 3)設置為空值(SET-NULL):折中操作,但是要注意外碼列是否允許空值,如果不允許為空,則該處理無效。
用戶定義的完整性
? ??????用戶定義的完整性就是針對某一具體應用的數據必須滿足的語義要求
? ? 從屬性和元組兩方面進行分析:
? ? 1)屬性上約束條件的定義:
? ? ? ? 列值不允許為空(NOT NULL)
? ? ? ? ? 列值不允許相同(UNIQUE)
? ? ? ? ? ? 檢查列值是否滿足一個布爾表達式(CHECK)
? ? 2)屬性上的約束條件檢查和違約處理
? ? ? ? 插入元組或者修改屬性的值的時候,RDBMS會根據約束條件檢查插入或者更改是否符合要求。如果不符合要求直接拒絕操作
? ? 3)元組上約束條件的定義:
? ? ? ? 通過CHECK設置約束條件。即元組級別的限制,此時重點在于不同列屬性之間的關系。
? ? 4)元組上約束條件的檢查和違約處理
? ? ? ? 同屬性上的一致,RDBMS會根據約束條件檢查,如果不符合要求直接拒絕操作
使用完整性約束命名子句
? ? 我們可以通過完整性約束命名子句來創建完整性約束并標識相關約束以及對相關約束進行操作。
? ? 創建完整性約束命名子句
格式: CONSTRAINT <完整性約束條件名> [PRIMARY KEY短語 ?? |FOREIGN KEY短語 ?? |CHECK短語]
? ? ? ?修改完整性約束命名子句:
? ? 使用ALTER TABLE語句修改表中完整性限制:
ALTER TABLE Student? ? ? ? ? ?DROP CONSTRAINT C1;? ? ?
?ALTER TABLE Student ??????? ??ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999)
域完整性
? ? 域完整性同樣是用戶完整性的一種,不過通過定義 域來實現。該域中指明了應滿足的約束條件。
[例14]建立一個性別域,并聲明性別域的取值范圍
?????????? CREATE DOMAIN GenderDomainCHAR(2)
?????????? CHECK (VALUE IN ('男','女') );
????????? 這樣? ?對Ssex的說明可以改寫為
????????? Ssex GenderDomain