什么是数据库的完整性 ➢ 数据的正确性和相容性 ➢ 防止不合语义的数据进入数据库。 ➢ 完整性:真实地反映现实世界
数据的完整性和安全性是两个不同概念
为维护数据库的完整性,DBMS必须:
完整性约束条件定义
完整性控制机制 检查用户发出的操作请求是否违背了完整性约束条件
违约反应 如果发现用户的操作请求使数据违背了完 整性约束条件,则采取一定的动作来保证 数据的完整性。
一、实体完整性定义
【例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)
);
二、实体完整性检查和违约处理
一、参照完整性定义
【例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表中相应的元组*/ );
一、属性上的约束条件的定义
CREATE TABLE时定义 ➢ 列值非空(NOT NULL) ➢ 列值唯一(UNIQUE) ➢ 检查列值是否满足一个布尔表达式(CHECK)
二、属性上的约束条件检查和违约处理
三、元组上的约束条件的定义
四、元组上的约束条件检查和违约处理
CONSTRAINT <完整性约束条件名>
[PRIMARY KEY短语
|FOREIGN KEY短语
|CHECK短语]
SQL支持域的概念,并可以用CREATE DOMAIN语句建立一个域以及该域应该满足的完整性约束条件。
一、定义触发器 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;
DROP TRIGGER <触发器名> ON <表名>;
写在最后: 本数据库专栏是由爱吃老谈酸菜的DV一同完成的,博客链接在主页友链,是我的好哥们✈ Name:风骨散人,目前是一名双非在校大学生,预计考研,热爱编程,热爱技术,喜欢分享,知识无界,希望我的分享可以帮到你!名字的含义:我想有一天我能有能力随心所欲不逾矩,不总是向生活低头,有能力让家人拥有富足的生活而不是为了生计而到处奔波。“世人慌慌张张,不过是图碎银几两。偏偏这碎银几两,能解世间惆怅,可让父母安康,可护幼子成长 …”