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 在實現參照完整性時需要考慮哪些方面?
RDBMs 在實現參照完整性時需要考慮以下幾個方面:
( l )外碼是否可以接受空值。
( 2 )冊 l 除被參照關系的元組時的考慮,這時系統可能采取的作法有三種: l )級聯刪除( CASCADES ) ; 2 )受限刪除( RESTRICTED ) ; 3 )置空值刪除( NULLIFIES )。 ( 3 )在參照關系中插入元組時的問題,這時系統可能采取的作法有: l )受限插入; 2 )遞歸插入。
( 4 )修改關系中主碼的問題。一般是不能用 UPDATE 語句修改關系主碼的。如果需要修改主碼值,只能先刪除該元組,然后再把具有新主碼值的元組插入到關系中。如果允許修改主碼,首先要保證主碼的惟一性和非空,否則拒絕修改。然后要區分是參照關系還是被參照關系。
6.假設有下面兩個關系模式:職工(職工號,姓名,年齡,職務,工資,部門號),其中職工號為主碼;部門(部門號,名稱,經理名,電話),其中部門號為主碼。用 sQL 語言定義這兩個關系模式,要求在模式中完成以下完整性約束條件的定義:定義每個模式的主碼;定義參照完整性;定義職工年齡不得超過 60 歲。
CREATE TABLE DEPT
(Deptno NUMBER(2),
Deptname VARCHAR(10),
Manager VARCHAR(10),
PhoneNumber Char(12)
CONSTRAINT PK_SC RIMARY KEY(Deptno));
CREATE TABLE EMP
(Empno NUMBER(4),
Ename VARCHAR(10),
Age NUMBER(2),
CONSTRAINT C1 CHECK ( Aage<=60),
Job VARCHAR(9),
Sal NUMBER(7,2),
Deptno NUMBER(2),
CONSTRAINT FK_DEPTNO
FOREIGN KEY(Deptno)
REFFERENCES DEPT(Deptno));
7.關系系統中,當操作違反實體完整性、參照完整性和用戶定義的完整性約束條件時,一般是如何分別進行處理的?
答:
對於違反實體完整性和用戶定義的完整性的操作一般都采用拒絕執行的方式進行處理。而對於違反參照完整性的操作,並不都是簡單地拒絕執行,有時要根據應用語義執行一些附加的操作,以保證數據庫的正確性。
8. 某單位想舉辦一個小型的聯誼會,關系 Male 記錄注冊的男賓信息,關系 Female 記錄注冊的女賓信息。建立一個斷言,將來賓的人數限制在 50 人以內(提示,先創建關系 Female 和 關系 male)
CREATE ASSERTION ASS_SUM
CHECK(50>=
SELECT SUM(a)
FROM(
SELECT COUNT(*) a FROM Male
UNION ALL
SELECT COUNT(*) a FROM Female
) AS Guest(a)
)