null第13章 数据库完整性第13章 数据库完整性什么是数据库的完整性
数据的正确性和相容性
防止不合语义的数据进入数据库。
例: 学生的年龄必须是整数,取值范围为14--29;
学生的性别只能是男或女;
学生的学号一定是唯一的;
学生所在的系必须是学校开设的系;
完整性:是否真实地反映现实世界DBMS的完整性控制机制DBMS的完整性控制机制1.完整性约束条件定义
2.完整性检查
3.违约处理
1.定义完整性约束条件1.定义完整性约束条件也称为完整性规则
完整性约束条件:数据模型的组成部分,加在数据库中数据上的语义条件
DBMS应提供定义数据库完整性约束条件,并把它们作为模式的一部分存入数据库中
完整性的实现 – SQL的DDL语句1.定义完整性约束条件(续)1.定义完整性约束条件(续)完整性约束条件作用的对象
列:对属性的取值类型、范围、精度等的约束条件
元组:对元组中各个属性列间联系的约束
关系:对若干元组间、关系集合上以及关系之间的联系的约束1.定义完整性约束条件(续)1.定义完整性约束条件(续)静态
对静态对象的约束,是反映数据库状态合理性的约束,如某一状态数据对象满足的约束
动态
对动态对象的约束,是反映数据库状态变迁的约束,如新、旧值间满足的约束完整性约束条件作用的状态:2.完整性检查2.完整性检查检查数据是否满足完整性约束条件的机制称为完整性检查
检查通常可在数据更新后或事务提交时进行例:银行数据库中“借贷总金额应平衡”的约束
从账号A转一笔钱到账号B为一个事务,从账号A转出去钱后账就不平了,必须等转入账号B后账才能重新平衡,这时需要进行完整性检查。3.违约处理3.违约处理处理方法
NO Action
Cascade
完整性定义和检查是由DBMS自动实现,无需应用程序来完成
第13章 数据库完整性第13章 数据库完整性13.1 实体完整性
13.2 参照完整性
13.3 用户定义完整性
13.4 完整性约束命名定义子句
13.5 默认值
13.6 规则13.1实体完整性13.1实体完整性13.1.1实体完整性的定义
13.1.2实体完整性检查和违约处理13.1.1实体完整性定义13.1.1实体完整性定义创建
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
时对主码定义的一种约束
根据主属性个数不同有两种定义方式
列级约束
表级约束
例
创建student表中sno的定义
创建sc表中sno和cno的定义
13.1.2实体完整性检查和违约处理13.1.2实体完整性检查和违约处理检查的
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
及处理措施
检查主码是否唯一,若不唯一则拒绝插入或修改
检查主码的个属性是否为空,只要有一个为空则拒绝插入或修改
检查方法
全表扫描
主码上建立索引再扫描13.2参照完整性13.2参照完整性13.2.1参照完整性定义
13.2.2参照完整性检查和违约处理13.2.1参照完整性定义13.2.1参照完整性定义在创建表时用Foreign Key定义,表明参照关系的某个或某组码引用了被参照关系的主码
例
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)
)13.2.2参照完整性检查与违约处理13.2.2参照完整性检查与违约处理首先分析Student和SC表,有多少种情况破坏了关系的参照完整性?
对student表删除和修改操作
对SC表的插入和修改操作
当不一致发生时,如何处理?
拒绝(No Action),默认策略
级联(Cascade)操作
设置为空(set-null)
学生(学号,姓名,性别,专业号,年龄)
专业(专业号,专业名)
思考:外码何时允许空值?13.2.2参照完整性检查与违约处理(续)13.2.2参照完整性检查与违约处理(续)例:显式
说明
关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书
参照完整性的违约处理示例
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 /*当删除student表记录时sc表采取cascade*/
on update cascade, /*当更新student表记录时sc表采取cascade*/
foreign key (cno) references course(cno)
on delete No Action /*当删除course表记录时sc表采取No*/
on Update cascade /*当更新course表记录时sc表采取cascade*/
)13.3用户定义的完整性13.3用户定义的完整性13.3.1属性上的约束条件的定义
13.3.2属性上的约束条件检查和违约处理
13.3.3元组上的约束条件的定义
13.3.4元组上的约束条件检查和处理13.3.1属性上的约束条件的定义13.3.1属性上的约束条件的定义属性上的约束条件
列值非空Not null
列值唯一Unique
检查列值是否满足一个布尔表达式
例
Create table Student(
Sno char(9) primary key,
Sname char(8) not null,
Ssex char(2) check(Ssex in (‘男’,’女’)),
Sage smallint default 18,
Sdept char(20) );13.3.1属性上的约束条件的定义(续)13.3.1属性上的约束条件的定义(续)例:sc表的grade值在0到100之间
Create Table SC (
Sno char(9) not null,
Cno char(4) not null,
Grade smallint check (grade>=0 and grade<=100),
primary key (sno, cno),
foreign key (sno) references Student(sno),
foreign key (cno) references Course(cno)
)
13.3.2属性上的约束条件检查与违约处理13.3.2属性上的约束条件检查与违约处理当插入元组或修改属性的值时,RDBMS自动检查约束条件,如果违约则拒绝执行操作13.3.3元组上的约束条件的定义13.3.3元组上的约束条件的定义方法:用check子句定义元组上的约束条件
是元组级限制,可以设置不同属性之间的取值的相互约束条件
例:
Create table student(
Sno char(9) primary key,
Sname char(8) not null,
Ssex char(2) check(Ssex in(‘男’,’女’)),
Sdept char(20),
Check (Ssex =‘女’ or Sname not like ‘Ms.%’)
);
13.3.4元组上的约束条件检查和违约处理13.3.4元组上的约束条件检查和违约处理当插入元组或修改属性值时,RDBMS自动检查约束条件,如果违约则拒绝执行操作13.4完整性约束命名子句13.4完整性约束命名子句(1)完整性命名子句
(2)修改表中的完整性限制(1)完整性命名子句(1)完整性命名子句格式:
Constraint <完整性约束条件名> [Promary key|Foreign key|Check短语]
例1,
Create table student
(sno numeric(9)
constraint C1 check(sno between 90000 and 99999),
sname char(22)
Constraint C2 not null,
Sage numeric(3) Constraint C3 Check(Sage<30),
Ssex Char(2) Constraint C4 check(Ssex in(‘男’,’女’)),
Constraint studentkey Primary key(sno) ); (1)完整性命名子句(1)完整性命名子句例2,
Create table teacher (
Eno numeric(4) primary key,
Ename char(10),
Job char(8),
Sal numeric(2),
Deduct Numeric(7,2),
Deptno numeric(2),
Constraint empfKey foreign key (deptno) references dept(deptno),
Cosntraint C1 check(sal+deduct >= 3000)
);(2)修改表中完整性的限制(2)修改表中完整性的限制方法:用Alter table修改表中的完整性限制
例,
除掉student表中对性别的限制
Alter table student Drop constraint c4
修改表student中的约束条件,要求学号改为900000-999999之间,年龄小于30改为小于40
Alter table Student drop constraint c1;
Alter table Student
Add constraint c1 check (sno between 900000 and 999999);
Alter table Student drop constraint c3
Alter table student add constraint c3 check(sage<40);(补充)修改被参照关系中主码的问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
(补充)修改被参照关系中主码的问题两种策略
(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):
修改参照关系中的主码时:不允执行操作
当修改参照关系的主码值,在被参照关系没有与之对应的值,则拒绝执行操作。13.5 默认值13.5 默认值插入行记录时,没有指定列的值,则默认值可指定列的取值;
默认值可以是任何取值为常量的对象;
默认值的创建
创建表时指定默认值:可以是在Management Studio中手动设置或SQL语句;
使用Create Default语句创建默认对象,然后使用存储过程sp_binddefault将该默认对象绑定到指定列。创建表时指定默认值创建表时指定默认值在Management Studio中手动设置默认值
使用SQL语句设定默认值
Create table tb
(
c1 int primary key,
c2 datetime default ( getdate() ),
c3 int default 10
)使用Create Default语句创建默认对象使用Create Default语句创建默认对象SQL语句操作默认对象
Create default default_name As constant_expression
sp_bindefault default_Name, binded_obj
sp_unbindefault binded_obj
Drop default default_nameDefault的SQL操作Default的SQL操作例如,
create default myd as 'abc'
exec sp_bindefault myd, 'student.sname'
exec sp_unbindefault 'student.sname'
drop default myd13.6 规则13.6 规则用于限制表中或者用户定义数据类型的值,完成数据检验,功能类似于Check约束
表中每列或每个用户定义数据类型只能和一个规则绑定
创建规则
语句
Create rule rule_name As condition_expression
sp_bindrule rule_name, obj_name
sp_unbindrule obj_name
Drop rule rule_nameRule的SQL操作Rule的SQL操作例如,
Create rule myr as @age between 15 and 25
exec sp_bindrule ‘myr’,'student.sage'
exec sp_unbindrule 'student.sage'
drop rule myr注意注意规则必须与列的数据类型兼容
规则不能绑定到text、image或timestamp列
规则绑定到列或自定义数据类型后,只有在数据发生变动时才起作用
同一列多次绑定规则时,只有最近一次绑定的规则才有效
如果列上有check约束,则check约束优先13.6 小结13.6 小结数据库的完整性是为了保证数据库中存储的数据是正确的,所谓正确的是指符合现实世界语义的。
DBMS完整性实现的机制
完整性约束定义机制
完整性检查机制
违背完整性约束条件时RDBMS应采取的动作
使用规则和默认值(对象)实现完整性小结小结完整性机制的实施会极大地影响系统性能
不同的数据库产品对完整性的支持策略和支持程度是不同的
许多数据库管理系统对完整性机制的支持比对安全性的支持要晚得多也弱得多
数据库厂商对完整性的支持越来越好,不仅在能保证实体完整性和参照完整性而且能在DBMS核心定义、检查和保证用户定义的完整性约束条件
利用触发器提供更精细和更强大的数据控制能力 下课了。。。 下课了。。。休息一会儿。。。