『數據庫』 樸實無華且枯燥的數據庫教程–入門必看!(不收藏,真的喫虧了)
什麼是數據庫的完整性
➢ 數據的正確性和相容性
➢ 防止不合語義的數據進入數據庫。
➢ 完整性:真實地反映現實世界
數據的完整性和安全性是兩個不同概念
- 數據的完整性
➢防止數據庫中存在不符合語義的數據,也就是防止數據庫中存在不正確的數據
➢防範對象:不合語義的、不正確的數據 - 數據的安全性
➢保護數據庫防止惡意的破壞和非法的存取
➢防範對象:非法用戶和非法操作
爲維護數據庫的完整性,DBMS必須:
- 提供定義完整性約束條件的機制
- 提供完整性檢查的方法
- 違約處理
完整性約束條件定義
- 完整性約束條件:數據模型的組成部分約束數據庫中數據的語義。
- DBMS應提供定義數據庫完整性約束條件,並把它們作爲模式的一部分存入數據庫中。
完整性控制機制
檢查用戶發出的操作請求是否違背了完整性約束條件
違約反應
如果發現用戶的操作請求使數據違背了完
整性約束條件,則採取一定的動作來保證
數據的完整性。
實體完整性
一、實體完整性定義
- 關係模型的實體完整性
➢ CREATE TABLE中用PRIMARY KEY定義 - 單屬性構成的碼有兩種說明方法
➢ 定義爲列級約束條件
➢ 定義爲表級約束條件 - 對多個屬性構成的碼只有一種說明方法
➢ 定義爲表級約束條件
【例1】
將Student表中的Sno屬性定義爲碼
(1)在列級定義主碼
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2) ,
Sage SMALLINT,
Sdept CHAR(20));
(2)在表級定義主碼
CREATE TABLE Student
(Sno CHAR(9),
Sname CHAR(20) NOT NULL,
Ssex CHAR(2) ,
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno)
);
二、實體完整性檢查和違約處理
- 插入或對主碼列進行更新操作時,RDBMS按照實體完整性規則自動進行檢查。包括:
➢ 檢查主碼值是否唯一,如果不唯一則拒絕插入或修改。檢查記錄中主碼值是否唯一的一種方法是進行全表掃描。
➢ 檢查主碼的各個屬性是否爲空,只要有一個爲空就拒絕插入或修改。
參照完整性
一、參照完整性定義
- 關係模型的參照完整性定義
➢ 在CREATE TABLE中用FOREIGN KEY短語定義哪些列爲外碼
➢ 用REFERENCES短語指明這些外碼參照哪些表的主碼
【例2】
例如,關係SC中一個元組表示一個學生選修的某門課程的成績,
(Sno,Cno)是主碼。Sno,Cno分別參照引用Student表的主
碼和Course表的主碼
定義SC中的參照完整性
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)
/*在表級定義參照完整性*/
);
二、參照完整性檢查和違約處理
1. 參照完整性違約處理
➢ 拒絕(NO ACTION)執行:默認策略
➢ 級聯(CASCADE)操作
➢ 設置爲空值(SET-NULL)
對於參照完整性,除了應該定義外碼,還應定義外碼列是否允許空值
【例3】
顯式說明參照完整性的違約處理示例
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)
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表中相應的元組*/ );
用戶定義的完整性
- 用戶定義的完整性就是針對某一具體應用的數據必須滿足的語義要求
- RDBMS提供,而不必由應用程序承擔
一、屬性上的約束條件的定義
CREATE TABLE時定義
➢ 列值非空(NOT NULL)
➢ 列值唯一(UNIQUE)
➢ 檢查列值是否滿足一個布爾表達式(CHECK)
二、屬性上的約束條件檢查和違約處理
- 插入元組或修改屬性的值時,RDBMS檢查屬性上的約束條件是否被滿足
- 如果不滿足則操作被拒絕執行
三、元組上的約束條件的定義
- 在CREATE TABLE時可以用CHECK短語定義元組上的約束條件,即元組級的限制
- 同屬性值限制相比,元組級的限制可以設置不同屬性之間的取值的相互約束條件
四、元組上的約束條件檢查和違約處理
- 插入元組或修改屬性的值時,RDBMS檢查元組上的約束條件是否被滿足
- 如果不滿足則操作被拒絕執行
完整性約束命名子句
- CONSTRAINT 約束
CONSTRAINT <完整性約束條件名>
[PRIMARY KEY短語
|FOREIGN KEY短語
|CHECK短語]
- 修改表中的完整性限制
使用ALTER TABLE語句修改表中的完整性限制
域中的完整性限制
SQL支持域的概念,並可以用CREATE DOMAIN語句建立一個域以及該域應該滿足的完整性約束條件。
觸發器
- 觸發器(Trigger)是用戶定義在關係表上的一類由事件驅動的特殊過程
➢ 由服務器自動激活
➢ 可以進行更爲複雜的檢查和操作,具有更精細和更強大的數據控制能力
一、定義觸發器
1. CREATE TRIGGER語法格式
CREATE TRIGGER <觸發器名>
{BEFORE | AFTER} <觸發事件> ON <表名>
FOR EACH {ROW | STATEMENT}
[WHEN <觸發條件>] <觸發動作體>
2.定義觸發器的語法說明
1)創建者:表的擁有者
2)觸發器名
3)表名:觸發器的目標表
4)觸發事件:INSERT、DELETE、UPDATE
5)觸發器類型:
➢行級觸發器(FOR EACH ROW)
➢語句級觸發器(FOR EACH STATEMENT)
6)觸發條件
➢ 觸發條件爲真
➢ 省略WHEN觸發條件
7) 觸發動作體
➢ 觸發動作體可以是一個匿名PL/SQL過程塊
➢ 也可以是對已創建存儲過程的調用
【例4】
定義一個BEFORE行級觸發器,爲教師表Teacher定義完整性規則“教授的工資不得低於4000元,如果低於4000元,自動改爲4000元”。
CREATE TRIGGER Insert_Or_Update_Sal
BEFORE INSERT OR UPDATE ON Teacher
/*觸發事件是插入或更新操作*/
FOR EACH ROW /*行級觸發器*/
AS BEGIN /*定義觸發動作
體,是PL/SQL過程塊*/
IF (new.Job='教授') AND (new.Sal < 4000) THEN
new.Sal :=4000;
END IF;
END;
激活觸發器
- 觸發器的執行,是由觸發事件激活的,並由數據庫服務器自動執行
- 一個數據表上可能定義了多個觸發器
同一個表上的多個觸發器激活時遵循如下的執行順序:
(1) 執行該表上的BEFORE觸發器;
(2) 激活觸發器的SQL語句;
(3) 執行該表上的AFTER觸發器
刪除觸發器
- 刪除觸發器的SQL語法:
DROP TRIGGER <觸發器名> ON <表名>;
- 觸發器必須是一個已經創建的觸發器,並且只能由具有相應權限的用戶刪除
小結
- 數據庫的完整性是爲了保證數據庫中存儲的數據是正確的
- RDBMS完整性實現的機制
➢ 完整性約束定義機制
➢ 完整性檢查機制
➢ 違背完整性約束條件時RDBMS應採取的動作
寫在最後:
本數據庫專欄是由愛喫老談酸菜的DV一同完成的,博客鏈接在主頁友鏈,是我的好哥們✈
Name:風骨散人,目前是一名雙非在校大學生,預計考研,熱愛編程,熱愛技術,喜歡分享,知識無界,希望我的分享可以幫到你!名字的含義:我想有一天我能有能力隨心所欲不逾矩,不總是向生活低頭,有能力讓家人擁有富足的生活而不是爲了生計而到處奔波。“世人慌慌張張,不過是圖碎銀幾兩。偏偏這碎銀幾兩,能解世間惆悵,可讓父母安康,可護幼子成長 …”
文章主要內容:
Python,C++,C語言,JAVA,C#等語言的教程
ACM題解、模板、算法等,主要是數據結構,數學和圖論
設計模式,數據庫,計算機網絡,操作系統,計算機組成原理
Python爬蟲、深度學習、機器學習
計算機系408考研的所有專業課內容
目前還在更新中,先關注不迷路。微信公衆號,cnblogs(博客園),CSDN同名“風骨散人”
如果有什麼想看的,可以私信我,如果在能力範圍內,我會發布相應的博文!
感謝大家的閱讀!😘你的點贊、收藏、關注是對我最大的鼓勵!