數據庫完整性


實體完整性

實體完整性要求每一個數據表都必須有主鍵,而作為主鍵的所有字段,其屬性必須是獨一及非空值。

主碼的聲明

方法一:單屬性列級定義主碼

CREATE TABLE Student( 
    Sno CHAR(9) PRIMARY KEY,
    Sname CHAR(20) NOT NULL,
    Ssex CHAR(2),
    Sage SMALLINT,
    Sdept CHAR(20)
 );

方法二:單屬性表級定義主碼

CREATE TABLE Student( 
    Sno CHAR(9),
    Sname CHAR(20) NOT NULL,
    Ssex CHAR(2),
    Sage SMALLINT,
    Sdept CHAR(20),
    PRIMARY KEY (Sno)
);

方法三:多屬性表級定義主碼

CREATE TABLE SC( 
    Sno CHAR(9) NOT NULL,
    Cno CHAR(4) NOT NULL,
    Grade SMALLINT,
    PRIMARY KEY (Sno,Cno) /*只能在表級定義主碼*/
);

總結

對於單屬性主碼可以有兩種定義方法:單屬性列級主碼和單屬性表級主碼

對於多屬性主碼只能定義在表級

 

思考

一個表可以有多個主碼嗎?

答:一張表只能有一個主碼,不可以有多個主碼。所謂的一張表有多個主碼,是指的聯合主碼(用多個字段作為一張表的主鍵)。

 

實體完整性檢查和違約處理

主要是檢查主碼是否唯一以及主碼是否為空,如果滿足上述兩種條件之一則拒絕更新。檢查的方法是進行全表掃描,這樣做的缺點是十分耗時,解決的辦法是為主碼建立一個索引(使用B樹或者B+樹來實現)。

 

參照完整性

又稱引用完整性,是數據的屬性,用以表明引用之有效。參照完整性不允許關系中又不存在的實體引用。參照完整性與實體完整性二者皆是關系模型必須要滿足的完整性約束條件,其目的在於保證數據的一致性。參照完整性是通過外碼來實現的,在CREATE TABLE中用FOREIGN KEY短語定義哪些為外碼,用REFERENCES短語指明這些外碼參照那些表中的主碼。

外碼的定義

方法一:定義列級參照完整性

CREATE TABLE Student(
    Sno CHAR(9) PRIMARY KEY, /* 列級完整性約束條件,Sno是主碼*/
    Sname CHAR(20) UNIQUE, 
    Ssex CHAR(2), 
    Sage SMALLINT, 
    Sdept CHAR(20) FOREIGN KEY REFERENCES DEPT(Deptno) /*在列級定義參照完整性*/
);

方法二:定義表級參照完整性

CREATE TABLE Student(
    Sno CHAR(9) PRIMARY KEY, /* 列級完整性約束條件,Sno是主碼*/
    Sname CHAR(20) UNIQUE, 
    Ssex CHAR(2), 
    Sage SMALLINT, 
    Sdept CHAR(20),
    FOREIGN KEY(Sdept) REFERENCES DEPT(Deptno)/*在表級定義參照完整性*/
);

也可以用一個表的主碼當做另一個表的外碼來使用

CREATE TABLE Course (
    Cno VARCHAR(10) PRIMARY KEY,
    Cname VARCHAR(20),
    Pcno VARCHAR(20),
    Credit FLOAT,
    FOREIGN KEY(Pcno) REFERENCES Course(Cno)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

 

一個表只能夠定義一個實體完整性約束但可以定義多個參照完整性約束

CREATE TABLE SC( 
    Sno CHAR(9) NOT NULL,
    Cno CHAR(4) NOT NULL, 
    Grade SMALLINT,
    PRIMARY KEY (Sno, Cno), /*在表級定義實體完整性*/ 
    FOREIGN KEY (Sno) REFERENCES Student(Sno), /*在表級定義參照完整性*/ 
    FOREIGN KEY (Cno) REFERENCES Course(Cno) /*在表級定義參照完整性*/ 
);

 

參照完整性的違約處理

  • 拒絕(NO ACTION)執行:不允許該操作執行。該策略一般設置為默認策略
  • 級聯(CASCADE)操作:當刪除或修改被參照表的一個元組造成了與參照表的不一致,則刪除或修改參照表中的所有造成不一致的元組
  • 設置為空值(SET-NULL):當刪除或修改被參照表的一個元組時造成了不一致,則將參照表中的所有造成不一致的元組的對應屬性設置為空值。

顯示說明參照完整性的違約處理示例

CREATE TABLE SC1(
    Sno CHAR(10) NOT NULL,
    Cno CHAR(4) NOT NULL,
    Grade SMALLINT,
    PRIMARY KEY(Sno,Cno),
    FOREIGN KEY (Sno) REFERENCES Student(Sno)
    ON DELETE CASCADE /*級聯刪除SC表中相應的元組*/
    ON UPDATE CASCADE, /*級聯更新SC表中相應的元組*/
    FOREIGN KEY (Cno) REFERENCES Course(Cno) 
    ON DELETE NO ACTION /*當刪除course 表中的元組造成了與SC表不一致時拒絕刪除*/
    ON UPDATE CASCADE  /*當更新course表中的cno時,級聯更新SC表中相應的元組*/
);

 

用戶定義完整性

用戶自定義完整性指針對某一具體關系數據庫的約束條件,他反應某一具體應用所涉及的數據必須滿足的語義要求。例如,某個屬性必須取值唯一,某個非主屬性也不能夠取空值,某個屬性的取值范圍在0-100之間。

屬性上的用戶定義完整性

定義方法:NOT NULL(非空), UNIQUE(唯一), CHECK(檢查是否滿足某個表達式)

特點:只涉及單個屬性

檢查時機:插入元祖或者修改屬性的值時

違約處理:拒絕執行

舉個例子:

CREATE TABLE Student(
    Sno CHAR(9) PRIMARY KEY,
    Sname CHAR(8) UNIQUE NOT NULL, /*唯一且非空*/
    Ssex CHAR(2) CHECK (Ssex IN  (‘男’,’女’)), /*性別屬性Ssex只允許取'男'或'女' */
    Sage SMALLINT, Sdept CHAR(20) 
);

 

元組上的用戶定義完整性

定義方法:在CREATE TABLE時可以用CHECK子句定義元祖上的約束條件

特點:可以設置不同屬性之間的取值的相互約束條件

檢查時機:插入或修改屬性的值時

違約處理:拒絕執行

CREATE TABLE Student(
    Sno CHAR(9) PRIMARY KEY,
    Sname CHAR(8) UNIQUE NOT NULL, /*唯一且非空*/
    Ssex CHAR(2),
    Sage SMALLINT,
    Sdept CHAR(20),
    CHECK (Ssex=’女’ OR Sname NOT LIKE 'Ms.%')
    /*定義了元組中Sname和Ssex兩個屬性值之間的約束條件*/    
);

 

完整性約束命名子句

 用法

CONSTRAINT <完整性約束條件名><完整性約束條件>

<完整性約束條件>包括NOT NULL, UNIQUE, PRIMARY KEY短語,FOREIGN KEY短語,CHECK短語等。

舉個栗子

CREATE TABLE Student(
    Sno NUMERC(6)
    CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),
    Sname CHAR(20)
    CONSTRAINT C2 NOT NULL,
    Sage NUMERIC(3)
    CONSTRAINT C3 CHECK (Sage < 30),
    Ssex CHAR(2)
    CONSTRAINT C4 CHECK (Ssex IN ('','')),
    CONSTRAINT StudentKey PRIMARY KEY(Sno)
);

如果想要修改表中的完整性約束限制,可以使用ALTER TABLE語句進行修改

/*刪除完整性約束*/
ALTER
TABLE Student DROP CONSTRAINT C4;

/*增添完整性約束*/
ALTER TABLE Student
ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999);

 

課后習題

假設有下面兩個關系:

職工(職工號,姓名,年齡,職務,工資,部門號),其中職工號為主碼;

部門(部門號,名稱,經理名,電話),其中部門號為主碼。

用SQL語言定義這兩個關系,要求在模式中完成以下完整性約束條件的定義:

(1)定義每個關系的主碼;(2)定義參照完整性;(3)定義職工年齡不得超過60歲。

 SQL:

CREATE TABLE Dept(
    Deptno char(20) PRIMARY KEY,
    Dname char(50) UNIQUE,
    Dmanager char(20) NOT NULL,
    Phone char(20) NOT NULL
);

create table Staff(
    Sno char(20) primary key,
    Sname char(20) unique,
    Sage NUMERIC(3),
    Spost char(20) not null,
    Swage smallint,
    SDept char(20),
    foreign key (Sdept) references Dept(Deptno),
    CONSTRAINT C1 CHECK (Sage <= 60)
);

 

運行結果:

 

 

 從上圖中的結果中我們可以看出因為年齡不滿足約束條件C1所以插入失敗

 當我們修改年齡之后便可以成功插入

 


 

之前在驗證PPT上的例子的時候一直報錯

check the manual that corresponds to your MySQL server version for the right syntax to use near

 經過查閱資料發現得知可能是自己MySQL的版本的問題,於是就從裝了一下MySQL,然后就可以正常的使用了。

 

參考:

https://blog.csdn.net/qq_42900286/article/details/106108616


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM