第5章 數據庫完整性 | 數據庫知識點整理
了解
- 數據庫的完整性約束條件
- 完整性約束條件分類
- 數據庫完整性概念與數據庫安全性概念的區別和聯系
掌握
- DBMS完整性控制機制的三個方面
- 完整性約束條件的定義
- 完整性約束條件的檢查和違約處理
- 使用觸發器實現數據庫完整性的方法
- 定義每個模式的主碼
- 定義參照完整性
- 定義於應用有關的完整性
知識點
- 什么是數據庫的完整性
- 數據庫的完整性是指數據的【正確性】和【相容性】
- 數據庫的完整性和安全性是兩個不同的概念,但是有一定的聯系
- 前者是為了防止數據庫中存在不符合語義的數據,防止錯誤信息的輸入和輸出,即所謂垃圾進垃圾出(Garbage In Garbage Out)所造成的無效操作和錯誤操作
- 后者是保護數據庫防止惡意的破壞和非法的存取。
- 也就是說,安全性措施的防范對象是【非法用戶和非法操作】,完整性措施的防范對象是【不合語義的數據】
- 完整性約束條件是指數據庫中的數據應該滿足的語義約束條件一般可以分為六類
-
- 靜態列級約束、靜態元組約束、靜態關系約束、動態列級約束、動態元組約束、動態關系約束。靜態列級約束是對一個列的取值域的說明,包括以下幾方面:
-
- 對數據類型的約束,包括數據的類型、長度、單位、精度等
- 對數據格式的約束
- 對取值范圍或取值集合的約束。
- 對空值的約束
- 其他約束
- 靜態元組約束就是規定組成一個元組的各個列之間的約束關系,靜態元組約束只局限在單個元組上。靜態關系約束是在一個關系的各個元組之間或者若干關系之間常常存在各種聯系或約束。常見的靜態關系約束有:
-
- 實體完整性約束。
- 參照完整性約束。
- 函數依賴約束。
- 修改列定義時的約束
- 修改列值時的約束
- 動態元組約束是指修改某個元組的值時需要參照其舊值,並且新舊值之間需要滿足某種約束條件。
- 動態關系約束是加在關系變化前后狀態上的限制條件,例如事務一致性、原子性等約束條件。
- 定義功能,即提供定義完整性約束條件的機制
- 檢查功能:即檢查用戶發出的操作請求是否違背了完整性約束條件
- 違約處理功能:如果發現用戶的操作請求使數據違背了完整性約束條件,則采取一定的動作來保證數據的完整性
- RDBMS在實現參照完整性時需要考慮可能破壞完整性的各種情況以及用戶違約后的處理策略
- 外碼是否可以接受空值刪除被參照關系的元組時的考慮,這時系統可能采取的作法有三種
-
- 級聯刪除(CASCADES)
- 受限刪除(RESTRICTED)
- 置空值刪除(NULLIFIES)
- 受限插入
- 遞歸插入
- 一般是不能用UPDATE語句修改關系主碼的。如果需要修改主碼值,只能先刪除該元組,然后再把具有新主碼值的元組插入到關系中。
- 如果允許修改主碼,首先要保證主碼的唯一性和非空,否則拒絕修改。然后要區分是參照關系還是被參照關系。
職工([職工號],姓名,年齡,職務,工資,部門號)部門([部門號],名稱,經理名,電話)- 定義每個模式的主碼
- 定義參照完整性
- 定義職工年齡不得超過60歲
CREATE TABLE DEPT (Deptno NUMBER(2) PRIMARY KEY, Deptname VARCHAR(10), Manager VARCHAR(10), PhoneNumber CHAR(12));CREATE TABLE EMP (Empno NUMBER(4) PRIMARY KEY, Ename VARCHAR(10), Age NUMBER(2), Job VARCHAR(9), Sal NUMBER(7,2), Deptno NUMBER(2), CONSTRAINT C1 CHECK(Age<=60), CONSTRAINT FK_DEPTNO FOREIGN KEY(Deptno) REFERENCES DEPT(Deptno));
- 對於違反實體完整性和用戶定義的完整性的操作,一般都采用拒絕執行的方式進行處理;
- 而對於違反參照完整性的操作,並不都是簡單地拒絕執行,有時要根據應用語義執行一些附加的操作,以保證數據庫的正確性
- 某單位想舉行一個小型的聯誼會,關系Male記錄注冊的男賓信息,關系Female記錄注冊的女賓信息。建立一個斷言,將來賓的人數限制在50人以內
CREATE TABLE Male (SerialNumber SmallInt PRIMARY KEY, Name CHAR(8), Age SmallInt, Occuptation CHAR(20) );CREATE TABLE Female (SerialNumber SmallInt PRIMARY KEY, Name CHAR(8), Age SmallInt, Occuptation CHAR(20) );CREATE ASSERTION Party /*建立斷言PARTY*/CHECK((SELECT COUNT(*) FROM Male)+(SELECT COUNT(*) FROM Female)<=50);
補充
-
-
- 定義關系的主碼意味着主碼屬性【唯一且所有主碼屬性不為空】
- 關於語句CREATE TABLE R(no int,sum int CHECK(sum>0))和CREATE TABLE R(no int,sum int,CHECK(sum>0)),【兩條語句都合法且約束效果一樣】【前者定義了屬性上的約束條件,后者定義了元組上的約束條件】【當sum屬性改變時檢查,上述兩種CHECK約束都要被檢查】
- 在CREATE TABLE時,用戶定義的完整性可以通過【NOT NULL】【UNIQUE】【CHECK】等子句實現
- 關系R的屬性A參照引用關系T的屬性A,T的某條元組對應的A屬性值在R中出現,當要刪除T的這條元組時,系統可以采用的策略包括【拒絕執行】【級聯刪除】【設為空值】
- 定義數據庫完整性一般是由SQL的【DDL】語句實現的
- 【GRANT】是SQL語言中的數據控制命令
- 【REFERENCES】允許用戶定義新關系時,引用其他關系的主碼作為外碼
- 綜合題
-