SQL语句(六)_NUIST
一、 实验目的
1. 掌握实体完整性、参照完整性和用户自定义完整性的定义方法。能够写出两种定义完整性的SQL语句。设计SQL语句验证完整性约束是否起作用。
2. 设计SQL语句验证完整性约束是否起作用。
3. 能够根据实际情况定义完整性约束的违约处理方式。
4. 会写简单的触发语句。
二、 实验内容和要求
1. 在实验一所创建的学生数据库中,增加以下对象的完整约束的描述
可以
(1) 使用Alter table的add constraint语句完成
(2) 用窗口界面完成(记得保存)
表1 Student表结构
列名 |
说明 |
数据类型 |
约束 |
Sno |
学号 |
普通编码定长字符串,长度为7 |
主键 |
Sname |
姓名 |
普通编码定长字符串,长度为10 |
非空 |
Ssex |
性别 |
普通编码定长字符串,长度为2 |
取值范围:{男,女} |
Sage |
年龄 |
微整型(tinyint) |
取值范围:15-26 |
Sdept |
所在系 |
普通编码不定长字符串,长度为20 |
默认值为“计算机系” |
Sid |
身份证号 |
普通编码定长字符串,长度为10 |
|
Sdate |
入学日期 |
日期 |
默认为系统当前日期 |
注:默认值关键词default ,系统当前日期用getdate()函数
表2 Course表结构
列名 |
说明 |
数据类型 |
约束 |
Cno |
课程号 |
普通编码定长字符串,长度为10 |
主键 |
Cname |
课程名 |
普通编码不定长字符串,长度为20 |
非空 |
Credit |
学时数 |
整型 |
取值大于0 |
Semester |
学期 |
小整型 |
|
Tno |
教师号 |
普通编码定长字符串,长度为8 |
表3 SC表结构
列名 |
说明 |
数据类型 |
约束 |
Sno |
学号 |
普通编码定长字符串,长度为7 |
外键,引用Student的主键 |
Cno |
课程号 |
普通编码定长字符串,长度为10 |
外键,引用Course的主键 |
Grade |
成绩 |
小整型 |
取值范围为0-100 |
表4 Teacher表结构
列名 |
说明 |
数据类型 |
约束 |
Tno |
教师号 |
普通编码定长字符串,长度为8 |
主键,约束名PK_Teacher |
Tname |
教师名 |
普通编码定长字符串,长度为10 |
候选码 |
Salary |
工资 |
定点小数,小数点前4位,小数点后2位 |
|
Title |
职称 |
普通编码定长字符串,长度为4 |
取值范围为:{教授,副教授,讲师}。 |
表1 Student表:ALTER TABLE Student ADD Sdate DATE;ALTER TABLE Student ADD CONSTRAINT c1_student CHECK (Sname IS NOT NULL);ALTER TABLE Student ADD CONSTRAINT c2_student CHECK (Ssex = '男' OR Ssex = '女');ALTER TABLE Student ADD CONSTRAINT c3_student CHECK (Sage BETWEEN 15 AND 26);ALTER TABLE Student ADD DEFAULT '计算机系' FOR Sdept;ALTER TABLE Student ADD DEFAULT GETDATE() FOR Sdate;
表2 Course表:ALTER TABLE Course ADD CONSTRAINT c1_course CHECK (Cname IS NOT NULL);ALTER TABLE Course ADD CONSTRAINT c2_course CHECK (Credit > 0);ALTER TABLE Course ADD Tno CHAR(8);
表3 SC表:ALTER TABLE SC ADD CONSTRAINT c1_sc CHECK(Grade BETWEEN 0 AND 100);
表4 Teacher表:ALTER TABLE Teacher ADD CONSTRAINT PK_Teacher PRIMARY KEY(Tno);ALTER TABLE Teacher ADD CONSTRAINT c1_teacher UNIQUE(Tname);ALTER TABLE Teacher ADD CONSTRAINT c2_teacher CHECK (Title = '教授' OR Title = '副教授' OR Title = '讲师');
2. 完整性约束的修改及定义违约处理(使用Alter table语句完成)
(1) 对SC表,外键SNO默认违约处理为级联删除,CNO的违约处理为级联更新。
ALTER TABLE SC ADD CONSTRAINT c2_sc FOREIGN KEY(Sno) REFERENCES Student(Sno) ON DELETE CASCADE;ALTER TABLE SC ADD CONSTRAINT c3_sc FOREIGN KEY(Cno) REFERENCES Course(Cno) ON UPDATE CASCADE;
(2) 对Teacher表,Tno为主键,约束名为PK_Teacher,Tname为候选码。
ALTER TABLE Teacher ADD CONSTRAINT PK_Teacher PRIMARY KEY(Tno);ALTER TABLE Teacher ADD CONSTRAINT c1_teacher UNIQUE(Tname);
3. 完整性约束的检查和违约处理
(1)对Student表插入两条元组,
Sno |
Sname |
Ssex |
Sage |
Sdept |
Sid |
Sdate |
0811101 |
张勇 |
男 |
21 |
计算机系 |
||
0831104 |
钱程 |
男 |
28 |
通信工程系 |
会产什么结果?将结果截屏,分析原因。
1) Sno为Student表主键, 不允许重复, 而Student表中已有Sno为0811101的学生记录, 违反了主键约束, 因此不能插入。
2) 已为Sage添加了自定义完整性约束: 取值范围:15-26, 此记录中Sage = 28违反了自定义完整性约束, 因此不能插入。
将student表中年龄(sage)字段的约束改为15-45,再试试看。提示:先drop constraint,再add constraint
3) 修改约束后改记录已符合约束, 因此可以插入。
(2)删除student表中元组
0811103 |
王敏 |
女 |
20 |
计算机系 |
会产生什么结果,请截屏,并分析原因。将SC表中关于参照完整性的默认违约处理更改为拒绝执行,再删除student表中的此元组,此时会产生什么结果,请截屏,并分析原因。
1) SC中的学号为0811103的记录会被一起删除。
2) 修改参照完整性为不执行后, SC中存在学号为0811103的记录, 因此从Student表删除学号为0811103的记录时会涉及到SC中的外键约束, 会被拒绝删除。
(3)将Course表中元组
C007 |
数据结构 |
4 |
4 |
更新为
C007 |
通信原理 |
4 |
4 |
再执行查询“查询选修了课程号为007的同学的学号,姓名,课程号,课程名和成绩”
对查询结果进行截屏。
SELECT Student.Sno, Sname, SC.Cno, Cname, Grade FROM Student JOIN SC ON Student.Sno = SC.Sno JOIN Course ON SC.Cno = Course.Cno WHERE Course.Cno = 'C007';
(4)输入一条符合SC表中完整性约束的要求的元组,将结果截屏,解释输入的元组有哪些必须要满足的约束要求。
INSERT INTO SC VALUES('0811101', 'C007', 99);
Sno需要满足外键约束: Sno要在被参照表Student中的Sno里选取, Cno需要满足外键约束: Cno要在被参照表Course中的Cno里选取, 联合主键Sno, Cno要满足完整性约束: 不能出现重复, Grade需要满足自定义完整性: 取值在0~100间。
以上操作,如果能够执行,需要给出SQL语句。
4. 触发器
(1) 在表Student中建立触发器,实现表Student和表SC的级联删除,也就是只要删除表Student中的元组学号为s1,则表SC中SNO为s1的元组也要删除。
执行delete from Student where SNo='0811101',检查一下结果
CREATE TRIGGER t_student ON Student INSTEAD OF DELETE AS BEGIN DECLARE @id CHAR(7) SELECT @id = Sno FROM deleted DELETE FROM Student WHERE Sno = @id DELETE FROM SC WHERE Sno = @id END;
触发器成功执行。
注意: 由于之前已经对SC表添加了级联删除的自定义约束, 因此这里触发器要成功的话要先把约束删除(表-设计-关系), 然后再执行
(2)course表中建立触发器﹐当向course表中插入一条选课记录时﹐检查表的Tno属性是否存在于表Teacher中﹐如果存在,则可以插入,否则,不能向course表中插入这条记录。
向course表中插入一条元组(c009,操作系统,4,5,T006)检查一下结果
CREATE TRIGGER t_course ON Course INSTEAD OF INSERT AS BEGIN DECLARE @id CHAR(10), @name VARCHAR(20), @credit TINYINT, @semester SMALLINT, @t_id CHAR(8) SELECT @id = Cno, @name = Cname, @credit = Credit, @semester = Semester ,@t_id = Tno FROM inserted IF((SELECT Teacher.Tno FROM Teacher JOIN inserted ON Teacher.Tno = @t_id) IS NOT NULL) BEGIN INSERT INTO Course VALUES(@id, @name, @credit, @semester, @t_id) END ELSE PRINT('插入失败') END;
Teacher表中没有教师编号为T006的记录, 插入失败, 触发器成功执行。
声明:
1. 仅供参考, 不保证正确性!
2. 图片模糊是因为我写完以后用word另存为html自动压缩了.
SQL语句(六)_NUIST相关推荐
- IBatis.net动态SQL语句(六)
在学习动态SQL语句之前,首先必须对条件查询有一定了解,先来学习如何向IBatis.Net的映射文件里传入参数. 一.条件查询 1.传递单个参数 如根据Id查询: <select id=&quo ...
- Java神鬼莫测之MyBatis注解开发之动态SQL语句(六)
1.Mybatis注解开发之动态SQL语句 背景:使用mybatis的注解开发动态Sql会比较麻烦, 很不方便, 所以不太推荐使用,该文章以查询作为案例,演示动态sql语句. 注意:Mybatis的动 ...
- mysql数据库比较语句,六条比较有用的MySQL数据库操作的SQL语句小结
在MySQL数据库操作中,我们常常编写一些SQL语句来实现自己想要的功能.但是对于初学MySQL数据库的人来说这似乎又有一定的难度.此文我们总结了六条比较有用的SQL语句,初学者可以套用下面的格式,接 ...
- SQL语句复习【专题六】
SQL语句复习[专题六] 用户 + 创建表 --创建一个新的用户,然后给新的用户创建一张表,然后给表中添加一些数据.查询表中的数据 --创建用户需要比较大的权限 DBA create user di ...
- mybatis入门(六)之SQL语句构建器类
转载自 mybatis SQL语句构建器类 问题 Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL语句.这么来做通常是由于SQL语句需要动态来生成-否则可以将它们放到外部文件或 ...
- SQL入门之第十六讲——总结下之前的SQL语句书写顺序
SQL语句的书写顺序与执行顺序不是一致的 1.SQL语句的书写顺序 语句的书写顺序是比较重要的,如果顺序不对去执行也是会报错的. 之前的SELECT.WHERE.ORDER BY.LIMIT.JOIN ...
- 六、常用的sql语句
1.sql语句的分类 DDL:表的创建,删除,修改 DML:数据的插入,删除,修改 DQL:数据的查询 DCL:数据控制语言,grant,revoke 2.主键.外键.候选键.超键 主键:作表的行的惟 ...
- MySql安装教程与HeidiSQL管理工具使用方法、HeidiSQL中SQL语句使用(六)
文章目录 Mysql下载路径 Mysql管理工具--HeidiSQL下载 安装完成之后可以进行sql语句测试编辑 设置主键自增长 HeidiSQL中SQL语句使用 创建数据库 删除与创建表 像表中插入 ...
- OA系统十六:请假申请二:【请假申请】这个内嵌界面中【提交请假表单数据】的SQL语句和Dao层;
本篇博客的主要内容是: 本篇博客的主要目的是:创建与"请假流程有关的"[LeaveForm请假单表.ProcessFlow审批任务流程表.Notice消息通知表]三张表的底层的Da ...
最新文章
- Nginx网站常见的跳转配置实例
- 这个宝藏工具,给你一种黑客般的感觉
- 离职交接文档_如何写好离职工作交接文档?
- 剑指offer 算法(树的两个节点的最低祖先)
- Hadoop安装记录(伪分布式)
- C++模拟键盘操作窗口入门
- 失配树(border树)
- C#中ToString格式大全
- Python-02-基础知识
- 树形列(无限级联下拉列的曲线版本)
- Unity3D之UGUI基础8:InputField输入栏
- LIO-SAM探秘第三章之代码解析(三) --- mapOptmization.cpp (1)
- c++ const 修饰变量位置含义
- 网络安全等级保护通用解决方案参考模板
- javaweb框架学习开端
- adobe premiere 不支持的视频驱动程序
- Tableau——制作南丁格尔玫瑰图
- jenkins 解决服务器远程启动jar方法无响应的方法
- 大学平均绩点计算器_【采访合集】大一必知“绩点”与“奥方面试”
- ei检索的cpss_我想查EI会议论文检索情况,请问是如何查询的呢?
热门文章
- 欧洲家具EN 597-1 跟EN 597-2两个阻燃标准一样吗?
- 威纶通触摸屏的配方功能具体使用方法介绍(宏指令写入PLC)
- Linux shell计算两个文件的交集,并集和差集
- wordpress开放注册和邮件问题解决
- 赤兔四足机器人的作用_中国唯一能跑跳的“赤兔”机器人,拿下全球学生设计评选桂冠!...
- 模拟电路软件oracle,电子商务模拟教学平台
- 绝版CocoStudio下载——致我们终将逝去的青春
- 电话接入系统的服务器设置,Skype for Business Server 中本地 PSTN 连接的计划电话系统...
- 数字通信和数据通信有何不同
- Windows XP Professional 32位 MSDN原版