数据库实验——数据库的完整性约束

1. 数据完整性。使用T-SQL语句完成以下内容。

1)将数据库stu的表course的cno字段定义为主键,约束名称为cno_pk;
USE student
ALTER TABLE XSKC.course
ADD CONSTRAINT cno_pk PRIMARY KEY(cno)
2)为表course中的字段cname添加唯一值约束;
USE student
ALTER TABLE XSKC.course
ADD CONSTRAINT cname_pk UNIQUE(cname)
3)对于数据表sc的sno、cno字段定义为外码,使之与表student的主码sno及表course的主码cno对应,实现如下参照完整性:
删除student表中记录的同时删除sc表中与该记录sno字段值相同的记录;
修改student表某记录的sno时,若sc表中与该字段值对应的有若干条记录,则拒绝修改;
修改course表cno字段值时,该字段在sc表中的对应值也应修改;
删除course表一条记录时,若该字段在在sc表中存在,则删除该字段对应的记录;
向sc表添加记录时,如果该记录的sno字段的值在student中不存在,则拒绝插入;

ALTER TABLE XSKC.sc
ADD CONSTRAINT sc_fk FOREIGN KEY (sno) REFERENCES XSKC.student(sno) on delete cascade on update no action,
FOREIGN KEY (cno) REFERENCES XSKC.course(cno) on delete cascade on update cascade
Go
4)定义check约束,要求学生学号sno必须为9位数字字符,且不能以0开头,第二三位皆为0;
ALTER TABLE XSKC.student
ADD CONSTRAINT sno_ck
CHECK(sno like ‘[1-9]00[0-9][0-9][0-9][0-9][0-9][0-9]’)
5)定义stu数据库中student表中学生年龄值在16~25范围内;
ALTER TABLE XSKC.student
ADD CONSTRAINT sage_ck
CHECK(sage between 18 and 30)
6)定义stu数据库student表中学生年龄值默认值为20;
ALTER TABLE XSKC.student
ADD CONSTRAINT sage_df
DEFAULT 20 FOR sage
7)修改student表学生的年龄值约束可以为15~30范围内;
ALTER TABLE XSKC.student
DROP CONSTRAINT sage_ck
go
ALTER TABLE XSKC.student
ADD CONSTRAINT sage_ck
CHECK(sage >= 15 AND sage <= 30)
8) 删除表course中字段cname的唯一值约束;
USE student
ALTER TABLE XSKC.course
DROP CONSTRAINT cname_pk

2. 以实验数据库为基础数据,编写以下触发器并测试。

1) 为表course建立一个 INSERT触发器,当插入的新行中课程学分(ccredit)的值不是1~6时,就激活该出发器,撤销该插入操作,并使用RAISERROR语句返回一个错误信息。
CREATE TRIGGER tri_INSERT_course ON XSKC.course
FOR INSERT
AS
DECLARE @ccredit tinyint
SELECT @ccredit=XSKC.course.ccredit
FROM XSKC.course,inserted
WHERE XSKC.course.ccredit=inserted.ccredit
IF @ccredit NOT BETWEEN 1 AND 6
BEGIN
ROLLBACK TRANSACTION
RAISERROR(‘插入课程学分不在~6之间’,16,10)
END
2)为course表再创建一个UPDATE触发器,当更新了某门课程的课程号信息时,就激活该触发器级联更新sc表中相关的课程号信息,并使用PRINT语句返回一个提示信息。
CREATE TRIGGER tri_UPDATE_course ON XSKC.course
FOR UPDATE
AS
IF UPDATE(cno)
BEGIN
DECLARE @oldcno char(3),@newcno char(3)
SELECT @oldcno=deleted.cno,@newcno=inserted.cno
FROM deleted,inserted
WHERE deleted.cno=inserted.cno
PRINT ‘准备级联更新XSKC.sc表中的课程号信息……’
UPDATE XSKC.sc
SET cno=@newcno
WHERE cno=@oldcno
PRINT ‘已经级联更新XSKC.sc表中原课程号’+@oldcno+‘为’+@newcno
END
3)为student表创建DELECT触发器,在删除中的一条记录的同时将sc表中的相应记录也删除。
CREATE TRIGGER tri_student on XSKC.student
AFTER DELETE
AS
BEGIN
DELETE FROM sc
WHERE sno=(SELECT sno FROM deleted)
END
4)创建INSTEAD OF触发器,当向sc表中插入记录时,先检查sno列上的值在student中是否存在,如果存在执行插入操作,如果不存在则提示“该学生不存在”。
CREATE TRIGGER tri_sc
ON XSKC.sc AFTER INSERT
AS
BEGIN
IF(SELECT COUNT(*) FROM inserted JOIN XSKC.student ON inserted.sno=student.sno)=0
BEGIN
ROLLBACK TRAN
PRINT ‘该学生不存在!’
END
END
5)比较约束与触发器的执行顺序。(在一个表中创建CHECK约束和触发器,然后向表中插入一条不符合约束和触发器的记录,察看谁先发生作用。)
ALTER TABLE XSKC.course
ADD CONSTRAINT CK_ccredit
CHECK (ccredit >= 1 AND ccredit <= 6)

INSERT XSKC.course
values(‘10’,‘数据库’,‘5’,7)
数据库实验——数据库的完整性约束_第1张图片
从实验可以看出,约束优先于for或after触发器起作用,它在更新前就生效,对要更新的值进行规则检查。当检查到与现有规则冲突时,系统给出错误消息,并取消更新操作。如果检查没有问题,更新被执行,再激活触发器。

你可能感兴趣的:(数据库)