第5章 數據庫完整性
數據庫的完整性是指數據的正確性和相容性
數據庫的正確性是指數據是符合現實世界語義、反映當前實際情況的;數據的相容性是指數據庫同一對象在不同關係表中的數據是符合邏輯的。
數據的完整性是爲了防止數據庫中存在不符合語義的數據,也就是防止數據庫中存在不正確的數據。數據的安全性是保護數據庫防止惡意破壞和非法存取,因此,完整性檢查和控制的防範對象是不合語義的、不正確的數據,防止他們進入數據庫,安全性控制的防範對象是非法用戶和非法操作,防止他們對數據庫數據的非法存取。
爲了維護數據庫的完整性,數據庫管理系統必須能夠實現:
- 提供定義完整性約束條件的機制
- 實體完整性
- 參照完整性
- 用戶定義完整性
- 提供完整性檢查的方法
- 進行違約處理
5.1 實體完整性
關係模型的實體完整性,是指在基本表中主屬性不能取空值
create table中用primary key定義(主碼)
單屬性構成的碼有兩種說明方法
- 定義爲列級約束條件
- 定義爲表級約束條件
對多個屬性構成的碼只有一種說明方法
- 定義爲表級約束條件
上述 primary key中的sno和cno都不能爲空
5.1.2 實體完整性檢查和違約處理
- 檢查主碼值是否唯一,如果不唯一 則拒絕插入或修改
- 檢查主碼的各個屬性是否爲空,只要有一個爲空就拒絕插入或修改
- 拒絕插入或修改是違約處理
- 檢查記錄的方法有全表掃描和索引檢查
5.2 參照完整性
5.2.1 參照完整性定義
關係模型的參照完整性定義
5.2.2 參照完整性檢查和違約處理
對被參照表和參照表進行增刪改操作時有可能破壞參照完整性,必須進行檢查以保證這兩個表的相容性
參照完整性是指在基本表中,外碼可以是空值或另一個關係主碼的有效值。
- SC表中增加一個元組,該元組的Sno屬性值在表Student中找不到一個元組,其Sno屬性值與之相等。
- 修改SC表中的一個元組,修改後該元組的Sno屬性值在表Student中找不到一個元組,其Sno屬性值與之相等。
- 從Student表中刪除一個元組,造成SC表中某些元組的Sno屬性值在表Student中找不到一個元組,其Sno屬性值與之相等。
- 修改Student表中一個元組的Sno屬性,造成SC表中某些元組的Sno屬性值在表Student中找不到一個元組,其Sno屬性值與之相等。
當上述的不一致發生時,系統可以採用以下策略加以處理。
- 拒絕執行
- 級聯操作
- 設置爲控制
5.3 用戶定義的完整性
5.3.1 屬性上的約束條件:
-
列值非空(NOT NULL)
- 列值唯一(UNIQUE)
- 檢查列值是否滿足一個條件表達式(CHECK)
5.3.2 元組上的約束條件
5.4 完整性約束命名子句
定義:
constraint <完整性約束條件名><完整性約束條件>
修改:
DROP/ADD
5.5 域中完整性限制
5.6斷言
5.7 觸發器
觸發器是用戶定義在關係表上的一類由事件驅動的特殊過程。
定義
激活
- 執行該表上的before觸發器
- 激活觸發器的SQL語句
- 執行該表上的after觸發器
對同一個表上的多個before/after觸發器,遵循“誰先創建誰先執行”的原則
習題:
1什麼是數據庫的完整性?
數據庫的完整性是指數據的正確性和相容性。
2 .數據庫的完整性概念與數據庫的安全性概念有什麼區別和聯繫?
數據的完整性和安全性是兩個不同的概念,但是有一定的聯繫。前者是爲了防止數據庫中存在不符合語義的數據,防止錯誤信息的輸入和輸出,即所謂垃圾進垃圾出( Garba : e In Garba : e out )所造成的無效操作和錯誤結果。後者是保護數據庫防止惡意的破壞和非法的存取。也就是說,安全性措施的防範對象是非法用戶和非法操作,完整性措施的防範對象是不合語義的數據。
3 .什麼是數據庫的完整性約束條件?可分爲哪幾類?
完整性約束條件是指數據庫中的數據應該滿足的語義約束條件。一般可以分爲六類:靜態列級約束、靜態元組約束、靜態關係約束、動態列級約束、動態元組約束、動態關係約束。
靜態列級約束是對一個列的取值域的說明,包括以下幾個方面: ( l )對數據類型的約束,包括數據的類型、長度、單位、精度等; ( 2 )對數據格式的約束; ( 3 )對取值範圍或取值集合的約束; ( 4 )對空值的約束; ( 5 )其他約束。
靜態元組約束就是規定組成一個元組的各個列之間的約束關係,靜態元組約束只侷限在單個元組上。
靜態關係約束是在一個關係的各個元組之間或者若干關係之間常常存在各種聯繫或約束。
常見的靜態關係約束有: ( l )實體完整性約束; ( 2 )參照完整性約束; ( 3 )函數依賴約束。
動態列級約束是修改列定義或列值時應滿足的約束條件,包括下面兩方面: ( l )修改列定義時的約束; ( 2 )修改列值時的約束。
動態元組約束是指修改某個元組的值時需要參照其舊值,並且新舊值之間需要滿足某種約束條件。
動態關係約束是加在關係變化前後狀態上的限制條件,例如事務一致性、原子性等約束條件。
4 . DBMS 的完整性控制機制應具有哪些功能?
DBMS 的完整性控制機制應具有三個方面的功能:
( l )定義功能,即提供定義完整性約束條件的機制;
( 2 )檢查功能,即檢查用戶發出的操作請求是否違背了完整性約束條件;
( 3 )違約反應:如果發現用戶的操作請求使數據違背了完整性約束條件,則採取一定的動作來保證數據的完整性。
5 . RDBMS 在實現參照完整性時需要考慮哪些方面?
關係數據庫管理系統在實現參照完整性時需要考慮以下幾個方面:
- ( l )外碼是否可以接受空值。
- ( 2 )冊 l 除被參照關係的元組時的考慮,這時系統可能採取的作法有三種:
- l )級聯刪除( CASCADES ) ;
- 2 )受限刪除( RESTRICTED ) ;
- 3 )置空值刪除( NULLIFIES )。
- ( 3 )在參照關係中插入元組時的問題,這時系統可能採取的作法有: l )受限插入; 2 )遞歸插入。
- ( 4 )修改關係中主碼的問題。一般是不能用 UPDATE 語句修改關係主碼的。如果需要修改主碼值,只能先刪除該元組,然後再把具有新主碼值的元組插入到關係中。如果允許修改主碼,首先要保證主碼的惟一性和非空,否則拒絕修改。然後要區分是參照關係還是被參照關係。
6.關係系統中,當操作違反實體完整性、參照完整性和用戶定義的完整性約束條件時,一般是如何分別進行處理的?
對於違反實體完整性和用戶定義的完整性的操作一般都採用拒絕執行的方式進行處理。
而對於違反參照完整性的操作,並不都是簡單地拒絕執行,有時要根據應用語義執行一些附加的操作,以保證數據庫的正確性。