数据库系统概论
An Introduction to Database System
第八章 数据库完整性第八章 数据库完整性什么是数据库的完整性
数据的正确性和相容性
防止不合语义的数据进入数据库 。
例,学生的年龄必须是整数,取值范围为 14--29;
学生的性别只能是男或女;
学生的学号一定是唯一的;
学生所在的系必须是学校开设的系;
完整性:否真实地反映现实世界完整性控制机制
1.完整性约束条件定义机制
2.完整性检查机制
3.违约反应完整性约束条件定义
完整性约束条件:数据模型的组成部分约束数据库中数据的语义
DBMS应提供定义数据库完整性约束条件,
并把它们作为模式的一部分存入数据库中完整性检查
检查用户发出的操作请求是否违背了完整性约束条件违约反应
如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性。
第八章 数据库完整性
8.1 完整性约束条件
8.2 完整性控制
8.3 Oracle的完整性
8.4 小结完整性约束条件完整性约束条件作用的对象
列:对属性的取值类型、范围、精度等的约束条件
元组:对元组中各个属性列间的联系的约束
关系:对若干元组间、关系集合上以及关系之间的联系的约束完整性约束条件
静态
对静态对象的约束是反映数据库状态合理性的约束静态约束是指数据库每一确定状态时的数据对象所应满足的约束条件,它是反映数据库状态合理性的约束,这是最重要的一类完整性约束。
完整性约束条件
动态
对动态对象的约束是反映数据库状态变迁的约束动态约束是指数据库从一种状态转变为另一种状态时,新、旧值之间所应满足的约束条件,它是反映数据库状态变迁的约束。
完整性约束条件分类六类完整性约束条件
静态列级约束
静态元组约束
静态关系约束
动态列级约束
动态元组约束
动态关系约束完整性约束条件(续)
对象状态动态列级约束 动态元组约束 动态关系约束动态 ④ ⑤ ⑥
静态列级约束 静态元组约束 静态关系约束静态 ① ② ③
列 元组 关系 对象粒度完整性约束条件
1,静态列级约束
静态列级约束:对的取值域的说明
最常见、最简单、最容易实现的一类完整性约束完整性约束条件
五类静态列级约束
1) 数据类型约束:数据的类型、长度、单位、精度等例:学生姓名的数据类型为字符型,长度为 8
2) 对数据格式的约束例:
学号:前两位表示入学年份,后四位为顺序编号日期,YY.MM.DD。
完整性约束条件
3) 取值范围或取值集合的约束例:规定成绩的取值范围为 0-100
年龄的取值范围为 14-29
性别的取值集合为 [男,女 ]
4) 对空值的约束空值:未定义或未知的值空值:与零值和空格不同有的列允许空值,有的则不允许,如成绩可为空值
5) 其他约束例:关于列的排序说明,组合列等完整性约束条件
2,静态元组约束规定元组的各个列之间的约束关系例:订货关系中发货量 <=订货量教师关系中教授的工资 >=700元静态元组约束只局限在元组上完整性约束条件
3,静态关系约束关系的各个元组之间或若干关系之间存在的各种联系或约束常见静态关系约束:
1) 实体完整性约束
2) 参照完整性约束
3) 函数依赖约束
4) 统计约束函数依赖约束
关系字段间存在的函数依赖例:在学生-课程-教师关系
SJT(S,J,T) 的函数依赖:
( (S,J) → T,T→ J )
主码,(S,J)
统计约束
定义某个字段值一个关系多个元组的统计值之间的约束关系
例:职工平均工资的 2倍 <=部门经理的工资 <=
职工平均工资的 5倍职工平均工资值,统计值完整性约束条件
4,动态列级约束动态列级约束是修改列定义或列值时应满足的约束条件完整性约束条件
1) 修改列 定义 时的约束例:将原来允许空值的列改为不允许空值时,
该列目前已存在空值,则拒绝这种修改
2) 修改列值时的约束修改列值时新旧值之间要满足的约束条件例:职工工资调整 >= 原来工资年龄只能增长完整性约束条件
5,动态元组约束修改元组值,各个字段之间要满足的约束条件例,职工工资调整不得低于其原来工资 + 工龄 *1.5
完整性约束条件
6,动态关系约束关系变化前后状态:限制条件例:事务一致性、原子性等约束条件完整性约束条件小结粒 度 状态 列 级 元 组 级 关 系 级静 态 列定义
·类型
·格式
·值域
·空值元组值应满足的条件实体完整性约束参照完整性约束函数依赖约束统计约束动 态 改变列定义或列值 元组新旧值之间应满足的约束条件关系新旧状态间应满足的约束条件第八章 数据库完整性
8.1 完整性约束条件
8.2 完整性控制
8.3 Oracle的完整性
8.4 小结
8.2 完整性控制一,DBMS的完整性控制机制二、关系系统三类完整性的实现三、参照完整性的实现一,DBMS的完整性控制机制
1,定义功能一个完善的完整性控制机制应该允许用户定义各类完整性约束条件。
DBMS的完整性控制机制
2,检查功能
立即执行的约束 (Immediate constraints)
语句执行完后立即检查是否违背完整性约束
延迟执行的约束 (Deferred constrainsts)
完整性检查延迟到整个事务执行结束后进行
DBMS的完整性控制机制例:银行数据库中,借贷总金额应平衡,的约束就应该是延迟执行的约束
从账号 A转一笔钱到账号 B为一个事务,从账号 A转出去钱后账就不平了,必须等转入账号 B后账才能重新平衡,这时才能进行完整性检查。
DBMS的完整性控制机制
3,违约反应
拒绝该操作
其他处理方法
DBMS的完整性控制机制完整性规则五元组表示,
(D,O,A,C,P)
D( Data) 约束作用的 数据对象 ;
O( Operation) 触发完整性检查的 数据库操作当用户发出什么操作请求时需要检查该完整性规则是立即检查还是延迟检查;
A( Assertion) 数据对象必须满足的 断言 或 语义约束这是规则的主体;
C( Condition) 选择 A作用的数据对象值的 谓词 ;
P( Procedure) 违反完整性规则时触发的 过程 。
DBMS的完整性控制机制例 1:在,学号不能为空,的约束中
D 约束作用的对象为 Sno属性
O 插入或修改 Student 元组时
A Sno不能为空
C 无( A可作用于所有记录的 Sno属性)
P 拒绝执行该操作
DBMS的完整性控制机制例 2:在,教授工资不得低于 1000元,的约束中
D 约束作用的对象为工资 Sal属性
O 插入或修改职工元组时
A Sal不能小于 1000
C 职称 =′教授 ′
(A仅作用于职称 =‘教授 ’ 的记录 )
P 拒绝执行该操作二、关系系统三类完整性的实现
关系数据库系统都提供了定义和检查实体完整性、参照完整性和用户定义的完整性的功能
违反实体完整性规则和用户定义的完整性规则的操作:
一般是拒绝执行
违反参照完整性的操作:
拒绝执行
接受这个操作,同时执行一些附加的操作,以保证数据库的状态正确三、参照完整性的实现例,职工-部门数据库包含职工表 EMP和部门表 DEPT
1 DEPT关系的主码为部门号 Deptno
2 EMP关系的主码为职工号 Empno,外码为部门号 Deptno
称 DEPT为被参照关系或目标关系,EMP为参照关系
RDBMS实现参照完整性时需要考虑以下 4方面:
1,外码是否可以接受空值的问题
外码是否能够取空值:依赖于应用环境的语义
实现参照完整性:
系统提供定义外码的机制定义外码列是否允许空值的机制
1,外码是否可以接受空值的问题例 1:在职工-部门数据库中,
EMP关系包含有外码 Deptno
某元组的这一列若为空值,表示这个职工尚未分配到任何具体的部门工作和应用环境的语义是相符
1,外码是否可以接受空值的问题例 2:学生-选课数据库
Student关系为被参照关系,其主码为 Sno。
SC为参照关系,外码为 Sno。
若 SC的 Sno为空值:表明尚不存在的某个学生,或者某个不知学号的学生,选修了某门课程,其成绩记录在 Grade中与学校的应用环境是不相符的,因此 SC的 Sno列不能取空值。
2.在被参照关系中删除元组时的问题出现违约操作的情形:
删除被参照关系的某个元组( student)
而参照关系有若干元组 (SC)的外码值与被删除的被参照关系的主码值相同
2.在被参照关系中删除元组时的问题
违约反应:可有三种策略
级联删除( CASCADES)
受限删除( RESTRICTED)
置空值删除( NULLIFIES)
这三种处理方法,哪一种是正确的,要依应用环境的语义来定
2.在被参照关系中删除元组时的问题
级联删除将参照关系中外码值与被参照关系中要删除元组主码值相对应的元组一起删除
受限删除当参照关系中没有任何元组的外码值与要删除的被参照关系的元组的主码值相对应时,系统才执行删除操作,否则拒绝此删除操作
2.在被参照关系中删除元组时的问题
置空值删除删除被参照关系的元组,并将参照关系中与被参照关系中被删除元组主码值相等的外码值置为空值。
2.在被参照关系中删除元组时的问题例:要删除 Student关系中 Sno=950001的元组,
而 SC关系中有 4个元组的 Sno都等于 950001。
级联删除:将 SC关系中所有 4个
Sno=950001的元组一起删除。如果参照关系同时又是另一个关系的被参照关系,则这种删除操作会继续级联下去
受限删除:系统将拒绝执行此删除操作。
2.在被参照关系中删除元组时的问题
置空值删除:将 SC关系中所有 Sno=950001
的元组的 Sno值置为空值。
在学生选课数据库中,显然第一种方法和第二种方法都是对的。第三种方法不符合应用环境语义。
3.在参照关系中插入元组时的问题
出现违约操作的情形
需要在参照关系中插入元组,而被参照关系不存在相应的元组
违约反应
受限插入
递归插入
3.在参照关系中插入元组时的问题
受限插入
仅当被参照关系中存在相应的元组,其主码值与参照关系插入元组的外码值相同时,系统才执行插入操作,否则拒绝此操作。
递归插入
首先向被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插入元组。
3.在参照关系中插入元组时的问题例:向 SC关系插入( 99001,1,90)元组,
而 Student关系中尚没有 Sno=99001的学生
受限插入:系统将拒绝向 SC关系插入
( 99001,1,90)元组
递归插入:系统将首先向 Student关系插入
Sno=99001的元组,然后向 SC关系插入
( 99001,1,90)元组。
4,修改被参照关系中主码的问题
两种策略
(1)不允许修改主码
(2)允许修改主码允许修改主码策略
违约操作
要 修改被参照关系 中某些元组的主码值,而参照关系中有些元组的外码值正好等于被参照关系要修改的主码值
要 修改参照关系 中某些元组的主码值,
而被参照关系中没有任何元组的外码值等于被参照关系修改后的主码值允许修改主码策略
违约反应 (1)
修改的关系是被参照关系:与删除类似
级联修改
受限修改
置空值修改允许修改主码策略
级联修改
修改被参照关系中主码值同时,用相同的方法修改参照关系中相应的外码值。
受限修改
拒绝此修改操作。只当参照关系中没有任何元组的外码值等于被参照关系中某个元组的主码值时,这个元组的主码值才能被修改。
置空值修改
修改被参照关系中主码值,同时将参照关系中相应的外码值置为空值。
允许修改主码策略例:将 Student关系中 Sno=950001的元组中
Sno值改为 960123。而 SC关系中有 4个元组的 Sno=950001
级联修改:将 SC关系中 4个 Sno=950001元组中的 Sno值也改为 960123。如果参照关系同时又是另一个关系的被参照关系,则这种修改操作会继续级联下去。
允许修改主码策略
受限修改:只有 SC中没有任何元组的
Sno=950001时,才能修改 Student表中
Sno=950001的元组的 Sno值改为 960123。
置空值修改:将 Student表中 Sno=950001的元组的 Sno值改为 960123。而将 S表中所有
Sno=950001的元组的 Sno值置为空值。
在学生选课数据库中只有第一种方法是正确的。
允许修改主码策略
违约反应 (2)
修改的关系是参照关系:与插入类似
受限插入
递归插入参照完整性的实现
RDBMS在实现参照完整性时,
需要向用户提供定义主码、外码的机制
向用户提供按照自己的应用要求选择处理依赖关系中对应的元组的方法第八章 数据库完整性
8.1 完整性约束条件
8.2 完整性控制
8.3 Oracle的完整性
8.4 小结
8.3 Oracle的完整性一,Oracle中的实体完整性二,Oracle中的参照完整性三,Oracle中用户定义的完整性一,ORACLE中的实体完整性
ORACLE在 CREATE TABLE语句中提供了
PRIMARY KEY子句,供用户在建表时指定关系的主码列。
在列级使用 PRIMARY KEY子句
在表级使用 PRIMARY KEY子句
ORACLE中的实体完整性例 1:在学生选课数据库中,要定义 Student表的 Sno属性为主码
CREATE TABLE Student
(Sno NUMBER(8),
Sname VARCHAR(20),
Sage NUMBER(20),
CONSTRAINT PK_SNO PRIMARY KEY (Sno));
或,
CREATE TABLE Student
(Sno NUMBER(8) PRIMARY KEY,
Sname VARCHAR(20),
Sage NUMBER(20));
ORACLE中的实体完整性例 2:要在 SC表中定义 (Sno,Cno)为主码
CREATE TABLE SC
(Sno NUMBER(8),
Cno NUMBER(2),
Grade NUMBER(2),
CONSTRAINT PK_SC PRIMARY KEY (Sno,Cno));
ORACLE中的实体完整性
用户程序对主码列进行更新操作时,系统自动进行完整性检查
违约操作
使主属性值为空值的操作
使主码值在表中不唯一的操作
违约反应
系统拒绝此操作,从而保证了实体完整性二,ORACLE中的参照完整性定义参照完整性
FOREIGN KEY子句:定义外码列
REFERENCES子句:外码相应于哪个表的主码
ON DELETE CASCADE子语:
在删除被参照关系的元组时,同时删除参照关系中 外码值 等于被参照关系的元组中主码值的元组
ORACLE中的参照完整性例 1:建立表 EMP表
CREATE TABLE EMP
(Empno NUMBER(4),
Ename VARCHAR(10),
Job VERCHAR2(9),
Mgr NUMBER(4),
Sal NUMBER(7,2),
Deptno NUMBER(2),
CONSTRAINT FK_DEPTNO
FOREIGN KEY (Deptno)
REFERENCES DEPT(Deptno));
ORACLE中的参照完整性或:
CREATE TABLE EMP
(Empno NUMBER(4),
Ename VARCHAR(10),
Job VERCHAR2(9),
Mgr NUMBER(4),
Sal NUMBER(7,2),
Deptno NUMBER(2) CONSTRAINT FK_DEPTNO
FOREIGN KEY REFERENCES DEPT(Deptno));
ORACLE中的参照完整性
这时 EMP表中外码为 Deptno,它相应于 DEPT
表中的主码 Deptno。
当要修改 DEPT表中的 DEPTNO值时,先要检查
EMP表中有无元组的 Deptno值与之对应
若没有,系统接受这个修改操作
否则,系统拒绝此操作
ORACLE中的参照完整性
当要删除 DEPT表中某个元组时,系统要检查
EMP表,若找到相应元组即将其随之删除。
当要插入 EMP表中某个元组时,系统要检查
DEPT表,先要检查 DEPT表中有无元组的
Deptno值与之对应
若没有,系统拒绝此插入操作
否则,系统接受此操作三,ORACLE中用户定义的完整性
ORACLE中定义用户完整性的两类方法
用 CREATE TABLE语句在建表时定义用户完整性约束
通过触发器来定义用户的完整性规则
ORACLE中用户定义的完整性
1,用 CREATE TABLE语句在建表时定义用户完整性约束可定义三类完整性约束
列值非空( NOT NULL短语)
列值唯一( UNIQUE短语)
检查列值是否满足一个布尔表达式( CHECK
短语)
ORACLE中用户定义的完整性例 1:建立部门表 DEPT,要求部门名称 Dname列取值唯一,部门编号 Deptno列为主码
CREATE TABLE DEPT
(Deptno NUMBER,
Dname VARCHAR(9) CONSTRAINT U1 UNIQUE,
Loc VARCHAR(10),
CONSTRAINT PK_DEPT PRIMARY KEY (Deptno));
其中 CONSTRAINT U1 UNIQUE 表示约束名为 U1,
该约束要求 Dname列值唯一。
ORACLE中用户定义的完整性例 2,建立学生登记表 Student,要求学号在
900000至 999999之间,年龄 <29,性别只能是 ‘ 男 ’ 或 ‘ 女 ’,姓名非空
CREATE TABLE Student
(Sno NUMBER(5)
CONSTRAINT C1 CHECK
(Sno BETWEEN 10000 AND 99999),
Sname VARCHAR(20) CONSTRAINT C2 NOT NULL,
Sage NUMBER(3) CONSTRAINT C3 CHECK (Sage < 29),
Ssex VARCHAR(2)
CONSTRAINT C4 CHECK (Ssex IN ('男 ','女 '));
ORACLE中用户定义的完整性例 3,建立职工表 EMP,要求每个职工的应发工资不得超过 3000元。 应发工资实际上就是实发工资列 Sal与扣除项 Deduct之和。
CREATE TABLE EMP
(Eno NUMBER(4)
Ename VARCHAR(10),
Job VARCHAR(8),
Sal NUMBER(7,2),
Deduct NUMBER(7,2)
Deptno NUMBER(2),
CONSTRAINTS C1 CHECK (Sal + Deduct <=3000));
ORACLE中用户定义的完整性
2,通过触发器来定义用户的完整性规则
定义其它的完整性约束时,需要用数据库触发器( Trigger)来实现。
数据库触发器:一类靠事务驱动的特殊过程
一旦由某个用户定义,任何用户对该数据的增、
删、改操作均由服务器自动激活相应的触发子,
在核心层进行集中的完整性控制
定义数据库触发器的语句
CREATE [OR REPLACE] TRIGGER
ORACLE中用户定义的完整性例 4,为教师表 Teacher定义完整性规则
,教授的工资不得低于 800元,如果低于 800元,
自动改为 800元,
ORACLE中用户定义的完整性
CREATE TRIGGER UPDATE_SAL
BEFORE INSERT OR UPDATE OF Sal,Pos ON Teacher
FOR EACH ROW
WHEN (:new.Pos='教授 ')
BEGIN
IF,new.sal<800
THEN
:new.Sal:=800;
END IF;
END;
Oracle完整性小结
ORACLE提供定义完整性约束条件
CREATE TABLE语句
CREATE TRIGGER语句可以定义很复杂的完整性约束条件
ORACLE自动执行相应的完整性检查对于违反完整性约束条件的操作:
拒绝执行或者执行事先定义的操作第八章 数据库完整性
8.1 完整性约束条件
8.2 完整性控制
8.3 Oracle的完整性
8.4 小结
8.4 小结
数据库的完整性是为了保证数据库中存储的数据是正确的,所谓正确的是指符合现实世界语义的。
DBMS完整性实现的机制
完整性约束定义机制
完整性检查机制
违背完整性约束条件时 DBMS应采取的动作小结
完整性机制的实施会极大地影响系统性能
不同的数据库产品对完整性的支持策略和支持程度是不同的
许多数据库管理系统对完整性机制的支持比对安全性的支持要晚得多也弱得多
数据库厂商对完整性的支持越来越好,不仅在能保证实体完整性和参照完整性而且能在 DBMS核心定义、检查和保证用户定义的完整性约束条件下课了。。。