『数据库』这篇数据库的文章真没人看--数据库完整性
『數據庫』 樸實無華且枯燥的數據庫教程–入門必看!(不收藏,真的吃虧了)
文章目錄
- 實體完整性
- 參照完整性
- 用戶定義的完整性
- 完整性約束命名子句
- 域中的完整性限制
- 觸發器
- 激活觸發器
- 刪除觸發器
- 小結
什么是數據庫的完整性
? 數據的正確性和相容性
? 防止不合語義的數據進入數據庫。
? 完整性:真實地反映現實世界
數據的完整性和安全性是兩個不同概念
?防止數據庫中存在不符合語義的數據,也就是防止數據庫中存在不正確的數據
?防范對象:不合語義的、不正確的數據
?保護數據庫防止惡意的破壞和非法的存取
?防范對象:非法用戶和非法操作
為維護數據庫的完整性,DBMS必須:
- 提供定義完整性約束條件的機制
- 提供完整性檢查的方法
- 違約處理
完整性約束條件定義
完整性控制機制
檢查用戶發出的操作請求是否違背了完整性約束條件
違約反應
如果發現用戶的操作請求使數據違背了完
整性約束條件,則采取一定的動作來保證
數據的完整性。
實體完整性
一、實體完整性定義
? CREATE TABLE中用PRIMARY KEY定義
? 定義為列級約束條件
? 定義為表級約束條件
? 定義為表級約束條件
【例1】
將Student表中的Sno屬性定義為碼
(1)在列級定義主碼
(2)在表級定義主碼
CREATE TABLE Student (Sno CHAR(9), Sname CHAR(20) NOT NULL, Ssex CHAR(2) , Sage SMALLINT, Sdept CHAR(20), PRIMARY KEY (Sno) );二、實體完整性檢查和違約處理
? 檢查主碼值是否唯一,如果不唯一則拒絕插入或修改。檢查記錄中主碼值是否唯一的一種方法是進行全表掃描。
? 檢查主碼的各個屬性是否為空,只要有一個為空就拒絕插入或修改。
參照完整性
一、參照完整性定義
? 在CREATE TABLE中用FOREIGN KEY短語定義哪些列為外碼
? 用REFERENCES短語指明這些外碼參照哪些表的主碼
【例2】
例如,關系SC中一個元組表示一個學生選修的某門課程的成績,
(Sno,Cno)是主碼。Sno,Cno分別參照引用Student表的主
碼和Course表的主碼
定義SC中的參照完整性
二、參照完整性檢查和違約處理
1. 參照完整性違約處理
? 拒絕(NO ACTION)執行:默認策略
? 級聯(CASCADE)操作
? 設置為空值(SET-NULL)
對于參照完整性,除了應該定義外碼,還應定義外碼列是否允許空值
【例3】
顯式說明參照完整性的違約處理示例
用戶定義的完整性
一、屬性上的約束條件的定義
CREATE TABLE時定義
? 列值非空(NOT NULL)
? 列值唯一(UNIQUE)
? 檢查列值是否滿足一個布爾表達式(CHECK)
二、屬性上的約束條件檢查和違約處理
- 插入元組或修改屬性的值時,RDBMS檢查屬性上的約束條件是否被滿足
- 如果不滿足則操作被拒絕執行
三、元組上的約束條件的定義
- 在CREATE TABLE時可以用CHECK短語定義元組上的約束條件,即元組級的限制
- 同屬性值限制相比,元組級的限制可以設置不同屬性之間的取值的相互約束條件
四、元組上的約束條件檢查和違約處理
完整性約束命名子句
使用ALTER TABLE語句修改表中的完整性限制
域中的完整性限制
SQL支持域的概念,并可以用CREATE DOMAIN語句建立一個域以及該域應該滿足的完整性約束條件。
觸發器
? 由服務器自動激活
? 可以進行更為復雜的檢查和操作,具有更精細和更強大的數據控制能力
一、定義觸發器
1. CREATE TRIGGER語法格式
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元”。
激活觸發器
同一個表上的多個觸發器激活時遵循如下的執行順序:
(1) 執行該表上的BEFORE觸發器;
(2) 激活觸發器的SQL語句;
(3) 執行該表上的AFTER觸發器
刪除觸發器
小結
? 完整性約束定義機制
? 完整性檢查機制
? 違背完整性約束條件時RDBMS應采取的動作
寫在最后:
本數據庫專欄是由愛吃老談酸菜的DV一同完成的,博客鏈接在主頁友鏈,是我的好哥們?
Name:風骨散人,目前是一名雙非在校大學生,預計考研,熱愛編程,熱愛技術,喜歡分享,知識無界,希望我的分享可以幫到你!名字的含義:我想有一天我能有能力隨心所欲不逾矩,不總是向生活低頭,有能力讓家人擁有富足的生活而不是為了生計而到處奔波。“世人慌慌張張,不過是圖碎銀幾兩。偏偏這碎銀幾兩,能解世間惆悵,可讓父母安康,可護幼子成長 …”
文章主要內容:
Python,C++,C語言,JAVA,C#等語言的教程
ACM題解、模板、算法等,主要是數據結構,數學和圖論
設計模式,數據庫,計算機網絡,操作系統,計算機組成原理
Python爬蟲、深度學習、機器學習
計算機系408考研的所有專業課內容
目前還在更新中,先關注不迷路。微信公眾號,cnblogs(博客園),CSDN同名“風骨散人”
如果有什么想看的,可以私信我,如果在能力范圍內,我會發布相應的博文!
感謝大家的閱讀!😘你的點贊、收藏、關注是對我最大的鼓勵!
總結
以上是生活随笔為你收集整理的『数据库』这篇数据库的文章真没人看--数据库完整性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 外媒大赞这款国产电竞旗舰:体验过的最佳游
- 下一篇: 传音Tecno折叠新品亮相MWC 202