數據庫完整性
數據庫的完整性是指數據的正確性和相容性
正確性:數據是否符合現實世界的語義,反應當前實際狀況
相容性:數據庫對同一對象再不同關系表中的數據是符合邏輯的
為維護數據庫的完整性,數據庫管理系統必須實現如下功能
- 提供定義完整性約束條件的機制
- 提供完整性檢查的方法
- 進行違約處理
1. 實體完整性
1.1 定義實體完整性
關系模型的實體完整性再 create table 中用 primary key 定義。
對單屬性構成的碼
- 定義為列級約束條件
- 表級約束條件
create table student
(
sno char(9) primary key, //再列級定義主碼
sname char(20) not bull,
ssex char(2),
sage smallint,
sdept char(20)
);
create table student
(
sno char(9) ,
sname char(20) not bull,
ssex char(2),
sage smallint,
sdept char(20)
primary key(sno) //再表級定義主碼
);
create table sc
(
cno char(4) not null,
grade smallint,
primary key(sno,cno) //只能在表級定義主碼
)
1.2實體完整性檢查和違約處理
用primary key 定義了關系的主碼后每當用戶對基本表插入一條記錄或對主碼列進行更新操作時,關系數據庫管理系統將進行檢查
- 檢查主碼值是否唯一,如果不唯一則拒絕插入或修改
- 檢查主碼的各個屬性值是否為空,只要有一個為空則拒絕插入或修改
檢查主碼值是否唯一的一種方法是進行全盤掃描,依次判斷。
全盤掃描非常耗時,因此在建立時,系統會自動對主碼建立索引。進行B+樹索引
2.參照完整性
2.1定義參照完整性
關系模型的參照完整性再create table 中用foreign key 短語 定義外碼 用 references短語指明外碼參照那些表的主碼。
//定義sc中的參照完整性
create table sc
(
cno char(4) not null,
grade smallint,
primary key(sno,cno),
foreign key(sno) references students(sno), //再表級定義參照完整性
);
2.2參照完整性檢查和違約處理
參照完整性將兩個表中的相應元祖聯系起來了。因此對被參照表和參照表進行增刪改操作時有可能破壞參照完整性,必須進行檢查
被參照表(student) | 參照表(sc) | 違約處理 |
---|---|---|
可能破壞參照完整性 | 插入元組 | 拒絕 |
可能破壞參照完整性 | 修改外碼的值 | 拒絕 |
刪除元組 | 可能破壞參照完整性 | 拒絕/級聯刪除/設為空值 |
修改主碼的值 | 可能破壞參照完整性 | 拒絕/級聯刪除/設為空值 |
3.用戶定義的完整性
3.1屬性上的約束條件
- 列值非空(not null)
- unique 列值唯一
- 檢查列值是否滿足一個條件表達式(check語句)
(1)不允許為空
create table sc(
cno char(4) not null,
grade smallint not null,
primary key (sno,cno),
...
)
(2)列值唯一 unique
create table dept(
dname char(9) nuique not null,
location char(10),
primary key(deptno),
...
);
(3)用check短語指定列值應該滿足的條件
create tablestudent(
sname char(8) not null,
ssex char(2) check (ssex in ("男“,”女“),
sage smallint,
sdep char(20)
);
往表中插入或修改屬性的值時,關系數據庫管理系統將檢查屬性上的約束條件是否被滿足,如果不滿足則操作被拒絕執行。
3.2元組上約束條件
- 元組上約束條件的定義
create table student
(
sname char(8) not null,
ssex char(2),
sage smallint,
sdept char(20),
primary key (sno),
check (ssex='女'or sname not like 'ms.%')///
);
- 元祖上約束條件的檢查和違規處理
往表中插入或修改屬性的值時,關系數據庫管理系統將檢查屬性上的約束條件是否被滿足,如果不滿足則操作被拒絕執行。
4.完整性約束命名子句
4.1完整性約束命名子句
constraint <完整性約束條件名><完整性約束條件>
<完整性約束條件>包括not null,unique,primary key,foreign key,check
create table student(
sname char(20)
sage numeric(3)
ssex char(2)
);
4.2修改表中的完整性限制
alter table 語句修改表中的完整性限制
alter table student
//修改
alter table student //先刪除再修改
6.斷言
create assertion 指定更具一般性的約束,可以定義涉及多個表或聚集操作的比較復雜的完整性約束。斷言創建后,任何設計關系的操作都會觸發關系數據庫的檢查,不為真則拒絕執行。
6.1創建斷言的語句格式
create assertion <斷言名><check子句>
create assertion asse_sc_db_num
//刪除斷言的語句格式
drop assertion <斷言名>;
7.觸發器
trigger 用戶定義的由事件驅動的特殊過程
7.1 定義觸發器
觸發器:事件-條件-動作。
在特定的系統事件發生時,對規則的條件進行檢查,如果條件滿足,則執行規定的動作,否則不執行動作
create trigger<觸發器名>/當事件發生時,該觸發器被激活/
{before|after}<觸發事件>on<表名>//指明觸發器激活的時間是在執行觸發事件后還是事件前
referencing new|old row as<變量>//referencing 指出引用的變量
for each{row|statement} //定義觸發器的類型,指明動作執行的頻率
[when <觸發條件>]<觸發動作體>//僅當觸發條件為真時才執行觸發動作體
- 只有表的擁有者,即表的創建者才能再表上創建觸發器,並且一個表上只能創建一定數量的觸發器
- 觸發器名:觸發器名可以包含模式名,也可以不包含,同一模式下,觸發器名必須是唯一的,並且觸發器名和表名必須在同一模式下。
- 表名:觸發器只能定義再基本表,能定義在視圖上。
- 觸發事件:觸發事件可以是insert delete update,也可以是這些事件的組合,如insert or delete 還可以是 update of<觸發列> 、
- 觸發器類型:按照所觸發動作的間隔尺寸可以分為行為級觸發器和語句級觸發器
- 觸發條件:觸發器被激活時,只有當觸發條件為真時才觸發動作體執行,否則不執行。
create trigger sc_t
after update of grade on sc
referencing
for each row
when(newtuple.grade>=1.1*oldtuple.grade)
inseret into sc_u(sno,cno,oldgrade,newgrade,newgrade)
values(oldtuple.sno,oldtuple.cno,oldtuple.grade,newtuple.grade)
7.2激活觸發器
觸發器的執行是由觸發事件激活,並由數據庫服務器自動執行,一個數據表上可能定義了多個觸發器。
執行順序如下
- before觸發器
- 激活觸發器的sql語句
- 執行表上的after觸發器
7.3刪除觸發器
drop trigger<觸發器名>on<表名>;