学习数据库概论第六天_在数据库demo02中,在删除student表中的元组时把该元组的前两个属性值插入bian_s中-程序员宅基地

技术标签: 数据库  数据库概论  

第五章

数据库的完整性是指数据的正确性和相容性。数据的正确性是指数据是符合现实世界语义、反映当前实际状况的,数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑的。
数据的完整性是为了防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的护数据。数据的安全性是保护数据库防止恶意破坏和非法存取。因此,完整性检查和控制的防范对象是不合语义的、不正确的数据,防止它们进入数据库。安全性控制的防范对象是非法用户和非法操作,防止他们对数据库数据的非法存取。

为维护数据库完整性,数据库管理系统必须实现:
1.提供定义完整性约束条件的机制
完整性约束条件也称为完整性规则,是数据库中数据必须满足的语义约束条件。它表达了给定的数据模型中数据及其联系所具有的制约和依存规则,用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确、有效和相容。如关系模型的实体完整性、参照完整性和用户定义完整性。
2.提供完整性检查的方法
数据库管理系统中检查数据是否满足完整性约束条件的机制称为完整性检查。一般在insert、update/delete语句执行后开始检查,也可以在事务提交时检查。
3.进行违约处理

5.1实体完整性

1.定义实体完整性
对单属性有两种说明方法,一种是列级约束条件,另一种是定义为表级约束条件。对多个属性只有一种说明方法,即定义为表级约束条件。
例5.1 将Student表中的Sno属性定义为码。
create table Student
(Sno char(9) primary key,
Sname char(20) not null,
Ssex char(2),
Sage smallint,
Sdept char(20)
);
例5.2 将SC表中的Sno、Cno属性组定义为码。
Create table SC
(Sno char(9),
Sname char(20),
Ssex char(2),
Sage smallint,
Sdept char(20),
Primary key(Sno,Cno)
);
2.实体完整性检查和违约处理
用primary key定义关系的主码后每当用户程序对基本表插入一条记录或对主码列进行更新操作时,关系数据库管理系统的实体完整性规则自动进行检查。包括:
(1)检查主码值是否唯一,如果不唯一则拒绝插入或修改。
(2)检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。
从而保证了实体完整性。

5.2参照完整性

1.定义参照完整性
关系模型的参照完整性在create table中用foreign key短语定义定义哪些列为外码,用references短语指明这些外码参照哪些表的主码。
例5.3 定义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)
);
2.参照完整性检查和违约处理
(1)SC表中增加一个元组,该元组的Sno属性值在表Student中找不到一个元组,其Sno属性值与之相等。
(2)修改SC表中的一个元组,修改后该元组的Sno属性值在表Student中找不到一个元组,其Sno属性值与之相等。
(3)从Student表中删除一个元组,造成SC表中某些元组的Sno属性值在表Student中找不到一个元组,其Sno属性值与之相等。
(4)修改Student表中一个元组的Sno属性,造成SC表中某些元组的Sno属性值在表Student中找不到一个元组,其Sno属性值与之相等。
当上述额不一致发生时,系统可以采用以下策略。
(1)拒绝(no action)执行
不允许该操作执行。该策略一般设置为默认策略。
(2)级联(cascade)操作
(3)设置为空值
例5.4 显示说明参照完整性的违约处理示例。
Create table SC
(Sno char(9),
Cno char(4),
Grade smallint,
Primary key(Sno,Cno),
Foreign key(Sno) references Student(Sno)
On delete cascade
On update cascade,
Foreign key(Cno) references Course(Cno)
On delete no action
On update cascade
);

5.3用户定义的完整性

1.属性上的约束条件
可以根据应用要求定义属性上的约束条件,即属性值限制,包括:
列值非空(not null)
列值唯一(unique)
检查列值是否满足一个条件表达式(check短语)。
(1)不允许取空值
例5.5 在定义SC表时,说明Sno、Cno、Grade属性不允许取空值。
Create table SC
(Sno char(9) not null,
Cno char(4) not null,
Grade smallint not null,
Primary key(Sno,Cno)
);
(2)列值唯一
(3)用check短语指定列值应该满足的条件
例5.7 Student表的Ssex只允许取“男”或“女”。
Create table Student
(Sno char(9) primary key,
Sname char(8) not null,
Ssex char(2) check(Ssex in (‘男’,’女’)),
Sage smallint,
Sdept char(20)
);
例5.8 SC表的Grade的值应该在0和100之间。
Create table SC
(Sno char(9),
Cno char(4),
Grade smallint check(Grade>=0 and Grade<=100),
Primary key(Sno,Cno),
Foreign key(Sno) references Student(Sno),
Foreign key(Cno) references Course(Cno)
);
2.元组上的约束条件
同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件。
例5.9 当学生的性别是男时,其名字不能以Ms.打头。
Create table Student
(Sno char(9),
Sname char(8) not null,
Ssex char(2),
Sage smallint,
Sdept char(20),
Primary key(Sno),
Check(Ssex=’女’ or Sname not like ‘Ms.%’)
);

5.4完整性约束命名子句

SQL在create table语句中提供了完整性约束命名子句constraint,用来对完整性约束条件命名,从而可以灵活地增加、删除一个完整性约束条件。
1.完整性约束命名子句
Constraint 完整性约束条件名 完整性约束条件
完整性约束条件包括not null、unique、primary key、foreign key、check短语等。
例5.10 建立学生登记表Student,要求学号在90000-99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。
Create table Student
(Sno numeric(6)
Constraint C1 check(Sno between 90000 and 99999),
Sname char(20)
Constraint C2 not null,
Sage numeric(3)
Constraint C3 check(Sage<30),
Ssex char(2)
Constraint C4 check(Ssex in (‘男’,’女’),
Constraint Student primary key(Sno)
);
2.修改表中的完整性限制
例5.12 去掉Student表中对性别的限制。
Alter table Student
Drop constraint C4;
例5.13 修改表Student中的约束条件,要求学号改为在900000-999999之间,年龄由小于30改为小于40.
Alter table Student
Drop constraint C1;
Alter table Student
Add contraint C1 check(Sno>=900000 and Sno<=999999);
Alter table Student
Drop contraint C3;
Alter table Student
Add contraint C3 check(Sage<40);

5.6断言

在SQL中可以使用数据定义语言中的create assertion语句,通过声明性断言来指定更具一般性的约束。可以定义涉及多个表或聚集操作的比较复杂的完整性约束。断言创建以后,任何对断言中涉及关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行。
1.创建断言的语句格式
Create assertion断言名 check子句
每个断言都被赋予一个名字,check子句中的约束条件与where子句的条件表达式类似。
例5.18 限制数据库课程最多60名学生选修。
Create assertion ASSE_SC_DB_NUM
Check(60>=(select count()
From Course,SC
Where Course.Cno=SC.Cno and Cname=’数据库’) );
例5.19 限制每一门课程最多60名学生选修。
Create assertion ASSE_SC_CNUM1
Check(60>=all(select count(
)
From SC
Group by Cno));
2.删除断言的语句格式
Drop assertion 断言名

5.7触发器

触发器是用户定义在关系表上的一类由事件驱动的特殊过程。一旦定义,触发器将被保存在数据库服务器中。任何用户对表的增、删、改操作均由服务器自动激活相应的触发器,在关系数据库管理系统核心层进行集中的完整性控制。
1.定义触发器
触发器又叫事件-条件-动作规则。当特定的系统事件(如对一个表的增、删、改操作,事务的结束等)发生时,对规则的条件进行检查,如果条件成立则执行规则中的动作,否则不执行该动作。
Create trigger 触发器名
Before|after 触发事件 on 表名
Referencing new|old row as 变量
For each row|statement
[When 触发条件 触发动作体]

(1)只有表的拥有者,即创建表的用户才可以在表上创建触发器,并且一个表上只能创建一定数量的触发器。触发器的具体数量由具体的关系数据库管理系统在设计时确定。
(2)触发器名
触发器名可以包含模式名,也可以不包含模式名。同一模式下,触发器名必须是唯一的,并且触发器名和表名必须在同一模式下。
(3)表名
触发器只能定义在基本表上,不能定义在视图上。当基本表的数据发生变化时,将激活定义在该表上相应触发事件的触发器,因此该表也称为触发器的目标表。
(4)触发事件
触发事件可以是insert、delete或update,也可以是这几个事件的组合,如insert or delete等,还可以是update of触发列,…,即进一步指明修改哪些列时激活触发器。Before|after是触发时机。Before表示在触发事件的操作执行之前激活触发器,after表示在触发事件的操作执行之后激活触发器。
(5)触发器类型
触发器按照所触发动作的间隔尺寸可以分为行级触发器(for each row)和语句级触发器(for each statement)
(6)触发条件
触发器被激活时,只有当触发条件为真时触发动作体才执行,否则触发动作体不执行。如果省略when触发条件,则触发动作体在触发器激活后立即执行。
(7)触发动作体
触发动作体既可以是一个匿名PL/SQL过程块,也可以是对已创建存储过程的调用。如果是行级触发器,用户可以在过程体中使用NEW和OLD引用update/insert事件之后的新值和update/delete事件之前的旧值,如果是语句级触发器,则不能在触发动作体中使用new或old进行引用。
如果触发动作体执行失败,激活触发器的事件(即对数据库的增、删、改操作)就会终止执行,触发器的目标表或触发器可能影响的其他对象不发生任何变化。
例5.21 当对表SC的Grade属性进行修改时,若分数增加了10%,则将此次操作记录在另一个表SC_U(Sno、Cno、Oldgrade、Newgrade)中,其中Oldgrade是修改前的分数,Newgrade是修改后的分数。
Create trigger SC_T
After update of Grade on SC
Referencing
Oldrow as oldtuple,
Newrow as newtuple
For each row
When(newtuple.Grade>=1.1oldtuple.Grade)
Insert into SC_U(Sno,Cno,Oldgrade,Newgrade)
Values(oldtuple.Sno,oldtuple.Cno,oldtuple.Grade,newtuple.Grade)
例5.22 将每次对表Student的插入操作所增加的学生个数记录到表的Student-InsertLog中。
Create trigger Student_Count
After insert on Student
Referencing
Newtable as delta
For each statement
Insert into Studnet-InsertLog(Numbers)
Select count(
) from delta
例5.23 定义一个before行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。
Create trigger Insert_Or_Update_Sal
Before insert or update on Teacher
Referencing newrow as newtuple
For each row
Begin
If(newtuple.Job=’教授’) and(newtuple.Sal<4000)
Then newtuple.Sal:=4000;
End if;
End;
2.激活触发器
触发器的执行是由触发事件激活,并由数据库服务器自动执行的。一个数据表上可能定义多个触发器。
3.删除触发器
Drop trigger 触发器名 on 表名;

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/l13kddd/article/details/104597681

智能推荐

分布式光纤传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告_预计2026年中国分布式传感器市场规模有多大-程序员宅基地

文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大

07_08 常用组合逻辑电路结构——为IC设计的延时估计铺垫_基4布斯算法代码-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码

OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版

关于美国计算机奥赛USACO,你想知道的都在这_usaco可以多次提交吗-程序员宅基地

文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗

MySQL存储过程和自定义函数_mysql自定义函数和存储过程-程序员宅基地

文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程

半导体基础知识与PN结_本征半导体电流为0-程序员宅基地

文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0

随便推点

【Unity3d Shader】水面和岩浆效果_unity 岩浆shader-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader

广义线性模型——Logistic回归模型(1)_广义线性回归模型-程序员宅基地

文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型

HTML+CSS大作业 环境网页设计与实现(垃圾分类) web前端开发技术 web课程设计 网页规划与设计_垃圾分类网页设计目标怎么写-程序员宅基地

文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁_.net dll 全局目录-程序员宅基地

文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录

BRIEF特征点描述算法_breif description calculation 特征点-程序员宅基地

文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点

房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文_基于spring boot的房屋租赁系统论文-程序员宅基地

文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文