一、            实验目的

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相关推荐

  1. IBatis.net动态SQL语句(六)

    在学习动态SQL语句之前,首先必须对条件查询有一定了解,先来学习如何向IBatis.Net的映射文件里传入参数. 一.条件查询 1.传递单个参数 如根据Id查询: <select id=&quo ...

  2. Java神鬼莫测之MyBatis注解开发之动态SQL语句(六)

    1.Mybatis注解开发之动态SQL语句 背景:使用mybatis的注解开发动态Sql会比较麻烦, 很不方便, 所以不太推荐使用,该文章以查询作为案例,演示动态sql语句. 注意:Mybatis的动 ...

  3. mysql数据库比较语句,六条比较有用的MySQL数据库操作的SQL语句小结

    在MySQL数据库操作中,我们常常编写一些SQL语句来实现自己想要的功能.但是对于初学MySQL数据库的人来说这似乎又有一定的难度.此文我们总结了六条比较有用的SQL语句,初学者可以套用下面的格式,接 ...

  4. SQL语句复习【专题六】

    SQL语句复习[专题六] 用户 + 创建表  --创建一个新的用户,然后给新的用户创建一张表,然后给表中添加一些数据.查询表中的数据 --创建用户需要比较大的权限 DBA create user di ...

  5. mybatis入门(六)之SQL语句构建器类

    转载自    mybatis SQL语句构建器类 问题 Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL语句.这么来做通常是由于SQL语句需要动态来生成-否则可以将它们放到外部文件或 ...

  6. SQL入门之第十六讲——总结下之前的SQL语句书写顺序

    SQL语句的书写顺序与执行顺序不是一致的 1.SQL语句的书写顺序 语句的书写顺序是比较重要的,如果顺序不对去执行也是会报错的. 之前的SELECT.WHERE.ORDER BY.LIMIT.JOIN ...

  7. 六、常用的sql语句

    1.sql语句的分类 DDL:表的创建,删除,修改 DML:数据的插入,删除,修改 DQL:数据的查询 DCL:数据控制语言,grant,revoke 2.主键.外键.候选键.超键 主键:作表的行的惟 ...

  8. MySql安装教程与HeidiSQL管理工具使用方法、HeidiSQL中SQL语句使用(六)

    文章目录 Mysql下载路径 Mysql管理工具--HeidiSQL下载 安装完成之后可以进行sql语句测试编辑 设置主键自增长 HeidiSQL中SQL语句使用 创建数据库 删除与创建表 像表中插入 ...

  9. OA系统十六:请假申请二:【请假申请】这个内嵌界面中【提交请假表单数据】的SQL语句和Dao层;

    本篇博客的主要内容是: 本篇博客的主要目的是:创建与"请假流程有关的"[LeaveForm请假单表.ProcessFlow审批任务流程表.Notice消息通知表]三张表的底层的Da ...

最新文章

  1. Nginx网站常见的跳转配置实例
  2. 这个宝藏工具,给你一种黑客般的感觉
  3. 离职交接文档_如何写好离职工作交接文档?
  4. 剑指offer 算法(树的两个节点的最低祖先)
  5. Hadoop安装记录(伪分布式)
  6. C++模拟键盘操作窗口入门
  7. 失配树(border树)
  8. C#中ToString格式大全
  9. Python-02-基础知识
  10. 树形列(无限级联下拉列的曲线版本)
  11. Unity3D之UGUI基础8:InputField输入栏
  12. LIO-SAM探秘第三章之代码解析(三) --- mapOptmization.cpp (1)
  13. c++ const 修饰变量位置含义
  14. 网络安全等级保护通用解决方案参考模板
  15. javaweb框架学习开端
  16. adobe premiere 不支持的视频驱动程序
  17. Tableau——制作南丁格尔玫瑰图
  18. jenkins 解决服务器远程启动jar方法无响应的方法
  19. 大学平均绩点计算器_【采访合集】大一必知“绩点”与“奥方面试”
  20. ei检索的cpss_我想查EI会议论文检索情况,请问是如何查询的呢?

热门文章

  1. 欧洲家具EN 597-1 跟EN 597-2两个阻燃标准一样吗?
  2. 威纶通触摸屏的配方功能具体使用方法介绍(宏指令写入PLC)
  3. Linux shell计算两个文件的交集,并集和差集
  4. wordpress开放注册和邮件问题解决
  5. 赤兔四足机器人的作用_中国唯一能跑跳的“赤兔”机器人,拿下全球学生设计评选桂冠!...
  6. 模拟电路软件oracle,电子商务模拟教学平台
  7. 绝版CocoStudio下载——致我们终将逝去的青春
  8. 电话接入系统的服务器设置,Skype for Business Server 中本地 PSTN 连接的计划电话系统...
  9. 数字通信和数据通信有何不同
  10. Windows XP Professional 32位 MSDN原版