实验五 数据库的完整性与数据的插入、修改、删除
一、实验目的
1.掌握Management Studio的使用。
2.掌握SQL中INSERT、UPDATE、DELETE命令的使用。
3.理解SQL中的标识列、计算列和各种约束。
4.掌握使用SQL命令修改表的定义、删除表。
5.熟悉通过SQL对数据进行完整性控制。熟练掌握数据库三类完整性约束(实体完整性、用户自定义完整性、参照完整性)
6.了解SQL SERVER 的违反完整性处理措施;了解主键(PRIMARY KEY)约束、外键(FOREIGN KEY)约束、唯一性(UNIQUE)约束、检查(CHECK)约束、DEFAULT 约束、允许空值约束。
二、实验内容
使用SQL对数据进行完整性控制(三类完整性、CHECK短语、CONSTRAIN字句)。用实验证实,当操作违反了完整性约束条件时,系统是如何处理的。
(一)、认真学习三类完整性、CHECK短语、CONSTRAIN字句的使用,完成下列内容。

(1)先创建一TEST数据库,然后根据上述要求,在TEST数据库中建立数据表Table1。

首先创建一个全新的数据库test ;接着在创建一个新的table表。


刷新验证是否创建成功。
--shiyan5--问题一--1create database TESTon(name='TEST_data',filename='G:\MySQL File\DB实验\实验5\TEST.mdf',size=12,maxsize=36)log on(name='TEST_log',filename='G:\MySQL File\DB实验\实验5\TEST.ldf',size=5)use Testcreate table Table_1(class_id Varchar(6) not null,class_name Varchar(20) not null,director Varchar(4) ,monitor int,primary key (class_id)--特别注意primary主键的创建是要在空格里面的。)
(2)在TEST数据库中创建Table2,只含各个基本列(即:包括列名和数据类型,标识种子和计算列)

--2create table table_2(Stu_id int not null primary key,--特别注意什么是识别种子Stu_name varchar(20) not null unique,stu_sex varchar(2),Brithday smalldatetime,Age as year(getdate())-year(brithday),Phone varchar(8),Class_id Varchar(6))
由于题目要求的只是基本的列,没有说要将用户自定义完整性附加上去所以就没有将stu_sex 默认为女孩。其他的自定义同理。
(3)Table1中的外键能否在创建Table1表时建立?如不能,该何时、如何创建?请写出相应的SQL代码。
不能,table1表创建时候所需要的table2外键仍未创建好。在table2创建好之后再
创建外键。通过alter替换语句进行操作。

--3alter table table_1add constraint c1 foreign key(monitor) references table_2(stu_id)
明白其中几个关键词constraint约束,约束条件就是外键语句foreign key...references;
(4)通过ALTER TABLE语句对Table2进行表定义修改,为其增加各个约束。(注意:空值约束应单独添加)

--4 完善之前的2中的约束条件--直接从性别开始因为学号和姓名我在2中就已经完成约束条件alter table table_2add constraint c2 default '女' for stu_sexalter table table_2add constraint c3 check (phone like ('3935[0,9][0,9][0,9][0,9]'))alter table table_2add constraint c4 foreign key(class_id) references table_1(class_id)
参考一下老师的代码:
ALTER table table2Add constraint c2 PRIMARY KEY(Stu_id)ALTER table table2 alter column stu_name varchar (10) not nullALTER table table2Add constraint c3 unique(Stu_name)--not null 单独添加,并且在unique之前ALTER table table2Add constraint c5 DEFAULT '女' for Stu_sexALTER table table2Add constraint c6 CHECK(Phone LIKE '3935[0-9][0-9][0-9][0-9]')ALTER table table2Add constraint c7 foreign key(Class_id) references Table1(Class_id)
在这里面需要特别注意的是默认值default 和检查函数check的使用还有关键词like的用法。
(二)、验证数据库约束
本实验主要是通过对这两张表的操作来验证数据库约束的相关概念。
1、准备好(一)中要求的两个数据表Table1,Tabel2。
2、验证主键(PRIMARY KEY)约束
试运行下面代码:
insert into Table1(class_id,class_name,director)values('0101', '医学智能级班', 'J001')
请再一次insert into Table1(class_id,class_name,director) values('0101','医学智能级班', 'J001'), 请问能否顺利执行?如不能,出现什么问题?原因是什么?该如何解决?


不能,因为primary key主码是唯一表示的。第一次运行该语句是可以操作的但是第二次运行时在table-1中已经存在这个信息而且唯一的primary是0101,再次运行就会产生冲突。

将‘0101’修改为‘0102’就可以运行。因为primary key不发生冲突。
3、验证外键(FOREIGN)约束
试运行下面两段代码:
-- 允许将显式值插入表的标识列中 ON-允许 OFF-不允许
--语法:SET IDENTITY_INSERT [ database.[ owner.] ] { table } { ON | OFF }
set identity_insert table2 oninsert into Table2(stu_id,stu_name,stu_sex,birthdate,phone,class_id)values('2011001', '张三', '男','1990-9-23','39357887','0101')set identity_insert table2 offset identity_insert table2 oninsert into Table2(stu_id,stu_name,stu_sex,birthdate,phone,class_id)values('2011002', '李四', '男','1991-4-23','39357887','0102')set identity_insert table2 off
请问:上述两段代码能否顺利执行?如不能,出现什么问题?原因是什么?该如何解决?

不可以,出现table_2没有标示的反馈。
而且第二段代码中class_id(0102)原本是没有的,所以也不能顺利进行。
试运行下面代码:
delete from table1 where class_id='0101'
请问:上述代码能否顺利执行?如不能,出现什么问题?原因是什么?

可以顺利执行。

只剩下我在之前自己所采纳的class-id 0102的班级。
备注:创建基本表时可指定on delete cascade,则为级联删除。那么,系统认为删除table1记录时,table2中相关的记录也会同时删除
如果不指定on delete cascade时默认为受限删除。
4、验证唯一性(UNIQUE)约束
试运行下面代码:
set identity_insert table2 oninsert into Table2(stu_id,stu_name,stu_sex,birthdate,phone,class_id)values('2011003', '张三', '男','1990-9-23','39357887','0101')set identity_insert table2 off
请问:上述代码能否顺利执行?如不能,出现什么问题?原因是什么?
不能

张三重复——姓名是唯一的unique的。
5、验证检查(CHECK)约束
试运行下面代码:
insert into Table2(stu_name,stu_sex,birthdate,phone,class_id)values( '张历', '男','1990-9-23','79357887','0101')
请问:上述代码能否顺利执行?如不能,出现什么问题?原因是什么?

不能,因为stu_id是不能为空的。
(三)、数据的增删改
用SQL语句完成下列功能。使用数据库为SCHOOL数据库。
l、新开设一门课程,名叫网络安全与防火墙,学时40,编号为“0118”,主要介绍网络的安全与主要的防火墙软件。

--1insert into coursevalues('0118','网络安全与防火墙','40','主要介绍网络的安全与主要的防火墙软件')

在course表中存储成功!
2、先建立monitor表,其结构与student表大致一样.包含student表的学号、姓名、性别和班级编号,然后把各班班长的个人信息插入到monitor表中。

首先创建一个monitor表
--建立monitor表create table monitor(stu_id varchar(9),stu_name varchar(8),stu_sexvarchar(2),class_id varchar(4) primary key)

这是我的连接方式是通过student 和class连接回馈给我——违反约束?!
use schoolinsert into monitorselect Stu_id,Stu_name,Stu_sex,student.Class_idfrom student left join class on(Class.Monitor=student.stu_id and Student.Class_id=Class.Class_id)

老师给的代码可以运行——这就让我有点小迷糊!!
老师的代码:
insert into monitorselect Stu_id,Stu_name,Stu_sex,class.Class_idfrom Class left join student on(Monitor=Stu_id and class.Class_id=student.Class_id)
3、更新所有职称为“助教”的教师职称为“助理教师”。

--3update Teacherset TechPost='助理老师'where TechPost='助教'
4、在所有经济系班级的名称前加上“经济系”三个字。(class上的触发器可能造成不能正确更新,怎么办?)

update classset Class_name='经济系'+Class_namewhere Depar_id in(select Depar_idfrom Deparmentwhere Depar_name='经济系')
反馈问题给我?!

似乎是要关闭触发器!!!


删除触发器后可以正常使用该语句!
5、学号为“980101005”的学生的“数据结构”课程成绩改为80分。

update StudentGradeset Grade=80where Stu_id ='980101005' and Course_id = (select Course_idfrom coursewhere Course_name='数据结构')
6、删除studentgrade表中所有成绩不及格的记录。

--6deletefrom StudentGradewhere grade<60
7、删除studentgrade表中学号以“99”开头的学生选修课程的记录。

--7deletefrom StudentGradewhere Stu_id like '99%'
8、删除课程名为“C语言”的课程信息和所有这门课的选课信息。(不用级联删除,因级联需在创建表时定义。)
参考老师的代码。回顾一下级联删除的概念课本P86

delete from StudentGradewhere Course_id=(select Course_idfrom coursewhere Course_name='C语言')delete from CourseTeacherwhere Course_id=(select Course_idfrom coursewhere Course_name='C语言')delete from coursewhere Course_name='C语言'
三、实验小结
1.思考Alter与Update,Drop与Delete的区别
参考资料:数据库update和alter之间的区别
https://blog.csdn.net/f2006116/article/details/50978329

参考资料:
https://blog.csdn.net/weixin_38052444/article/details/81407738

简单来说,
Alter是修改整个表的定义结构;update是专门对表中的元组进行修改更新。用一个比喻的手法表示就是alter是表这个建筑的总设计师而update是里面的施工员,对于建筑里的一些细节形象进行施工。同理,drop是删除结构,delete是删除数据——drop就是爆破建筑的总设计师,而delete就是拆墙的小工。
2.对数据进行插入、修改、删除时需要注意哪些问题?
插入需要注意数据的完整尤其是对于主码来说。修改删除都要留意一下是否会影响级联等等方面




