數據庫原理(十 六)- 數據庫完整性

前言

數據庫的完整性是指數據的正確性和相容性。數據的正確性是指數據是符合現實世界語義、反映當前實際狀況的;數據的相容性是指數據庫同一對象在不同關係表的數據是符合邏輯的
數據的完整性和安全性是兩個既有聯繫又不盡相同的概念。數據的完整性是爲了防止數據庫中存在不符合語義的數據,也就是防止數據庫中存在不正確的數據;數據的安全性是保護數據庫防止惡意破壞和非法獲取

數據庫完整性功能要求

爲了維護數據庫的完整性,數據庫管理系統必須能夠實現如下功能:

  1. 提供定義完整性約束條件的機制
  2. 提供完整性檢查的方法
  3. 進行違約處理

關係數據庫管理系統使得完整性控制成爲其核心支持的功能,從而能夠爲所有用戶和應用提供一致的數據庫管理完整性

實體完整性

實體完整性的定義

關係模型的實體完整性在CREATE TABLE 中用PRIMARY KEY定義

  1. 對單屬性構成的碼有兩種說明方法,一種是定義列級約束條件,另一種是定義爲表級約束條件
  2. 對多個屬性構成的碼只有一種說明方法,即定義表級約束條件

列級約束條件

create table student(
   sno char(10) primary key,
   ......

)

表級約束條件

create table student(
   sno char(10) ,
   ......
   primary key(sno)
)

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

  1. 檢查主碼值是否唯一,如果不唯一則拒絕插入或修改
  2. 檢查主碼的各個屬性是否爲空,只要有一個爲空就拒絕插入或修改

參照完整性

關係模型的參照完整性在CREATE TABLE中用FOREIGN KEY短語定義哪些列爲外碼,用REFERENCES短語指明這些外碼參照哪些表的主碼

create table sc(
sno char(10) primary key,
cno char(10),
foreign key sno references student(sno) 
)

可被參照的對象:

  • 被參照表中的屬性
  • 參照表中自已的屬性

參照完整性檢查

  • 參照屬性的值必須與被參照表中屬性的值相同

違約處理

  • 拒絕執行
  • 級聯操作
  • 設置爲空值

用戶定義的完整性

屬性上的約束條件

  • 屬性上約束條件的定義,主要包括:
    • 列值非空(NOT NULL)
    • 列值唯一(UNIQUE)
    • 檢查列值是否滿足一個條件表達式(CHECK短語)
  • 屬性上約束條件的檢查和違約處理
    • 如果不滿足條件,就拒絕執行

元組上的約束條件

  • 元組上約束條件的定義,僅使用CHECK約束短語一項,是在表級約束上的
  • 元組上約束條件的檢查和違約處理
    • 如果不滿足條件,就拒絕執行

示例

CREATE TABLE student(
Sno char(10) primary key,
Sname char(10) unique not null,
Ssex char(2),
check(Ssex='女' or Sname NOT LIKE('Ms.%')
)

完整性約束命名子句

上面的完整性約束條件都在CREATE TABLE語句中定義,SQL還在CREATE TABLE語句中提供了完整性約束命名子句CONSTRAINT,用來對完整性約束條件命名,從而可以靈活地增加、刪除一個完整性約束條件

完整性約束命名子句

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

完整性約束條件包括NOT NULL、UNIQUE、 PRIMARY KEY、 FOREIGN KEY、 CHECK短語等

修改表中的完整性限制

alter table <表名>
 drop  constraint <完整性約束名> //刪除完整性約束
 add CONSTRAINT <完整性約束條件名> <完整性約束條件> //添加完整性約束

斷言

在涉及多表或聚集操作的比較複雜的完整性約束時使用

  • 創建斷言的語句格式
CREATE ASSERTION <斷言名> <CHECK 子句>
  • 刪除斷言的語句格式
DROP ASSERTION <斷言名>

觸發器

觸發器是用戶定義在關係表上的一類由事件驅動的特殊過程

定義觸發器

CREATE TRIGGER <觸發器名>
{BEFORE|AFIER} <觸發事件> ON <表名>  //觸發事件前/觸發事件後,觸發事件包括select、 delete、update和insert,可以單個也可以組合
REFERENCING|OLD ROW AS<變量>
FOR EACH{ROW|STATEMENT} //列級觸發器|語句級觸發器
[WHEN <觸發條件>]<觸發動作體>

激活觸發器

觸發器的執行是由觸發事件激活,並由數據庫服務器自動執行的。如果一個表上有多個觸發器,激活觸發器的順序是

  • 執行該表上的BEFORE觸發器
  • 激活觸發器的SQL語句
  • 執行該表上的AFTER 觸發器

刪除觸發器

DROP TRIGGER <觸發器名> ON <表名>

借鑑

王珊,薩師煊.數據庫系統概論(第五版)[M].北京:高等教育出版社,2014:157-172.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章