数据库-完整性

一、实验目的:

1、掌握数据库约束的概念;

2、熟悉SQL SERVER 的完整性约束技术。

3、了解SQL SERVER 的违反完整性处理措施。

二、实验环境:

       SQL Server2014

 

三、实验内容:

1.在前几次实验所使用的数据库中新建一个教师信息表,表名为Teacher,字段包括Tno(教师编号),Tname(姓名),Tsex(性别),Ttitle(职称),完整性包括:设定Tno为主键,Tname非空,Tsex的取值范围为“男”或“女”。

CREATE TABLE Teacher

扫描二维码关注公众号,回复: 2083812 查看本文章

    (

    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


猜你喜欢

转载自blog.csdn.net/qq_40956679/article/details/80967856