一、实验目的:
1、掌握数据库约束的概念;
2、熟悉SQL SERVER 的完整性约束技术。
3、了解SQL SERVER 的违反完整性处理措施。
二、实验环境:
SQL Server2014
三、实验内容:
1.在前几次实验所使用的数据库中新建一个教师信息表,表名为Teacher,字段包括Tno(教师编号),Tname(姓名),Tsex(性别),Ttitle(职称),完整性包括:设定Tno为主键,Tname非空,Tsex的取值范围为“男”或“女”。
CREATE TABLE Teacher
(
Tno CHAR(7) PRIMARY KEY,
Tname CHAR(20) NOT NULL,
Tsex CHAR(2)
CONSTRAINT C1 CHECK(Tsex IN('男','女')),
Ttitle CHAR(4),
);
2. 用insert语句插入如下记录,观察实验结果:
insert into Teacher values('2016001','王明','男','讲师')
insert into Teacher values('2016001','王英','女','助教')
insert into Teacher values('2016002','张方','a','讲师')
有错误,无法插入。因为:
消息 2627,级别 14,状态 1,第 1 行
违反了 PRIMARY KEY 约束“PK__Teacher__C450026D3BEFEFCB”。不能在对象“dbo.Teacher”中插入重复键。重复键值为 (2016001)。
语句已终止。
消息 2627,级别 14,状态 1,第 2 行
违反了 PRIMARY KEY 约束“PK__Teacher__C450026D3BEFEFCB”。不能在对象“dbo.Teacher”中插入重复键。重复键值为 (2016001)。
语句已终止。
消息 547,级别 16,状态 0,第 3 行
INSERT 语句与 CHECK 约束"C1"冲突。该冲突发生于数据库"S-T",表"dbo.Teacher",column 'Tsex'。
语句已终止。
3. 对Teacher表增加一个约束,Ttitle属性的取值范围为('助教','讲师','副教授','教授'),并插入一条记录:
insert into Teacher values('2016003','刘阳','男','研究员'),观察实验结果。
ALTER TABLE Teacher
ADD CONSTRAINT C2 CHECK(Ttitle IN('助教','讲师','副教授','教授'));
insert into Teacher values('2016003','刘阳','男','研究员');
无法插入记录,因为研究员不在约束内。
4. 为学生表Student增加一个约束,Ssex的取值范围为“男”或“女”。
ALTER TABLE Student
ADD CONSTRAINT C3 CHECK(Ssex IN('男','女'));
5. 为选课表Sc增加一个约束,Grade的取值在0至100之间。
(提示,3,4,5是对表的结构增加约束定义,使用命令为:Alter table)
ALTER TABLE Sc
ADD CONSTRAINT C4 CHECK(Grade BETWEEN 0 AND 100);
6. 为选课表Sc增加参照完整性及违约处理,定义sno为外键,与student表中的sno关联,当删除、更新student中的元组时,级联删除、更新Sc表中的相应元组,命令为:
alter table sc
add foreign key(sno) references student(sno)
on delete cascade
on update cascade
使用SQL语句,将Student表中姓名为”王敏”的元组,学号更改为“201315123”,然后查看SC表中的元组是否也做了相应的更改。
UPDATE Student
SET Sno='201315123'
WHERE Sname='王敏'
做了相应的更改。
7. 为选课表Sc增加参照完整性及违约处理,定义cno为外键,与course表中的cno关联,当删除、更新course中的元组时,级联删除、更新Sc表中的相应元组,并进行验证。
alter table sc
add foreign key(cno) references course(cno)
on delete cascade
on update cascade
8. 建立一个触发器,当向sc表中添加数据时,如果添加的数据与student表中的数据不匹配(没有对应的学号),则将此数据删除。
CREATE TRIGGER SC_8 ON SC FOR INSERT
AS
BEGIN
DECLARE @bh CHAR(9)
SELECT @bh= INSERTED.Sno FROM INSERTED
IF NOT EXISTS(SELECT Sno FROMStudent where Student.Sno=@bh)
delete from sc where sno=@bh
END
9. 创建一个修改触发器,当student表中的sno信息修改时,自动将SC表中的相应信息也修改。
(简单要求:修改仅为一条记录)
(注:8,9的操作使用create trigger命令,触发器创建成功后,自己使用insert语句,或者update语句进行验证,验证完毕,可以将触发器删除)
create trigger student_t onstudent for update
as
begin
declare @bh char(9)
declare @ah char(9)
select @bh=inserted.sno from inserted
select @ah=deleted.sno from deleted
if exists(select sno from sc where sc.sno=@ah)
update sc set sno=@bh where sno=@ah;
end