数据库实验课作业
2完整性
2.1.3内容:
(1)在数据库school中建立表Stu_Union,进行主键约束,在没有违反实体完整性的前提下插入并更新一条记录。
(2)演示违反实体完整性的插入操作。
(3)演示违反实体完整性的更新操作。
(4)演示事务的处理,包括事物的建立,处理,以及出错时的事务回退。
(5)通过建立Schoship表,插入数据,演示当与现有的数据环境不等时,无法建立实体完整性以及参照完整性。
代码:
use school
--2.1 实体完整性
CREATE TABLE Stu_Union(sno CHAR(5) NOT NULL UNIQUE,
sname CHAR(8),
ssex CHAR(1),
sage INT,
sdept CHAR(20),
CONSTRAINT PK_Stu_Union PRIMARY KEY(sno) );
insert Stu_Union values ( ’10000’,’王敏’,’1’,23,’CS’);
UPDATE Stu_Union SET sno=’’ WHERE sdept=’CS’;
UPDATE Stu_Union SET sno= ’95002’ WHERE sname=’王敏’;
select * from stu_union;
--以系统管理员或sa用户登录,进入Management Studio,成功建立表,令SNO为主键
insert Stu_Union values ( ’95002’,’王嘉’,’1’,23,’CS’);
--插入信息,但是违反了主键唯一性,将破坏实体完整性,系统终止操作
UPDATE Stu_Union SET sno= NULL WHERE sno=’95002’;
--违反了主键not null属性,将破坏实体完整性,系统终止操作
SET XACT_ABORT ON
BEGIN TRANSACTION T1
insert into stu_union values (’95009’,’李勇’,’M’,25,’EE’);
insert into stu_union values (’95003’,’王浩’,’0’,25,’EE’);
insert into stu_union values (’95005’,’王浩’,’0’,25,’EE’);
select * From stu_union;
--违反了 PRIMARY KEY 约束 ’PK_Stu_Union’。不能在对象 ’dbo.stu_union’ 中插入重复键
SET XACT_ABORT ON
BEGIN TRANSACTION T2
insert into stu_union values (’95007’,’李明’,’M’,25,’EE’);
select * From stu_union;
insert into stu_union values (’95009’,’李进’,’F’,22,’CS’);
COMMIT TRANSACTION T2
--违反了primary key 约束PK_Stu_Union,插入的数据违反实体完整性,插入失败,事务回滚
select * From stu_union;
--T2失败时,整个事务回滚到初始状态
Create Table Scholarship
(
M_ID varchar(10),Stu_id char(10),R_money int
)
insert into Scholarship values (’0001’,’700000’,5000)
insert into Scholarship values (’0001’,’800000’,8000)
select * from Scholarship
Alter Table Scholarship add
Constraint PK_Scholarship Primary key(M_ID)
--无法创建约束,无法在表Scholarship中可为空的列上定义
Alter Table Scholarship add
Constraint FK_Scholarship Foreign key(STU_ID) references STUDENTS(sid)
--ALTER TABLE语句与FOREIGN KEY约束PK_Scholarship冲突
2.2.3内容:
(1)建立表course,令cno为其主键,并在stu_union中插入数据。
(2)建立表SC,令sno和cno分别为参照stu_union表以及Course表外键,设定为级联删除,并令(sno,cno)为其主键。插入数据
(3)演示违反参照完整性的插入数据。
(4)在stu_union中删除数据,演示级联删除。
(5)在Course中删除数据,演示级联删除。
(6)建立Stu_Card表,令stu_id为参照stu_union表的外键,令card_id为其主键,并插入数据。
(7)建立ICBC_card表,令stu_card_id为参照Stu_Card表的外键,令bank_id为其主键,并插入数据。
(8)通过删除students表中的一条记录,演示三个表的多重级联删除。
(9)演示事务中进行多重级联删除失败的处理。
(10)演示互参照问题及其解决方法。
代码:
--2.2 参照完整性
insert Stu_Union values (’10001’,’李勇’,’0’,24,’EE’)
select * from Stu_Union;
create table Course (
cno char(4) NOT NULL UNIQUE,
cname varchar(50) NOT NULL,
cpoints int,
constraint PK primary key (cno));
insert Course values (’0001’,’ComputerNetworks’,2);
insert Course values (’0002’,’Databsae’,3);
--为演示参照完整性,建立表Courses,令cno为其主键,并在stu_union中插入数据
CREATE TABLE SC(
sno CHAR(5) REFERENCES Stu_Union (sno) on delete cascade,
cno CHAR(4) REFERENCES Course(cno) on delete cascade,
grade INT,
CONSTRAINT PK_SC PRIMARY KEY (sno,cno)
);
insert into sc values (’95002’,’0001’,2);
insert into sc values (’95002’,’0002’,2);
insert into sc values (’10001’,’0001’,2);
insert into sc values (’10001’,’0002’,2);
Select * From SC;
--建立表SC,令sno和cno分别为参照stu_union表以及Courses表的外键,设定为级联删除,并令(sno,cno)为其主键,在不违反参照完整性的前提下,插入数据
insert into sc values (’99’,’101’,2);
--演示违反参照完整性的插入数据
delete from Stu_Union where sno=’10001’;
select * from SC;
--在Stu_Union中删除数据,演示级联删除
delete from Course where cno=’0002’;
select * from SC;
--在Course中删除数据,演示级联删除
create table Stu_Card(
card_id char(14),
stu_id char (10) references students(sid) on delete cascade,
remained_money decimal (10,2),
constraint PK_stu_card Primary key (card_id)
)
insert into Stu_Card values ( ’05212567’,’800001216’,100.25);
insert into Stu_Card values ( ’05212222’,’800005753’,200.50);
select * from Stu_card;
--为了演示多重级联删除,建立Stu_Card表,令stu_id为参照stu_union表的外键,令card_id为其主键,并插入数据
create table ICBC_Card(
bank_id char(20),
stu_card_id char (14) references stu_card(card_id) on delete cascade,
restored_money decimal (10,2),
constraint PK_Icbc_card Primary key (bank_id)
)
insert into ICBC_Card values ( ’9558844022312’,’05212567’,15000.1);
insert into ICBC_Card values ( ’9558844023645’,’05212222’,50000.3);
select * from ICBC_Card;
--为了演示多重级联删除,建立ICBC_Card表,令stu_card_id为参照Stu_Card表的外键,令bank_id为其主键,并插入数据
alter table choices drop [FK_CHOICES_STUDENTS];
alter table choices add
CONSTRAINT [FK_CHOICES_STUDENTS] FOREIGN KEY
(
[sid]
) REFERENCES [dbo].[STUDENTS] (
[sid]
)on delete cascade;
delete from students where sid=’800001216’;
select * from stu_card;
select * from icbc_card;
--通过删除students表中的一条记录,演示三个表的多重级联删除
Alter table ICBC_Card
drop constraint FK__ICBC_Card__stu_c__6c190EBB;
Alter table ICBC_Card
add constraint FK_ICBC_Card foreign key (stu_card_id)
references Stu_card(card_id) on delete no action ;
--演示事务中进行多重级联删除失败的处理,修改ICBC_Card表的外键属性,使其变为On delete No action,演示事务中通过删除students表中的一条记录,多重级联删除失败,整个事务回滚到初始状态
Begin Transaction del
delete from students where sid=’800005753’;
select * from stu_card;
select * from icbc_card;
Commit Transaction del
--DELETE 语句与 REFERENCE 约束"FK_CHOICES_STUDENTS"冲突。该冲突发生于数据库"School",表"dbo.CHOICES", column ’sid’
select * from stu_card;
select * from icbc_card;
--演示互参照问题及其解决方法
create table listen_course (
teacher_id char(6),tname varchar(20),course_id char(4)
constraint PK_listen_course primary key(teacher_id)
constraint FK_listen_course foreign key(course_id)
references teach_course(course_id)
)
create table teach_course(
course_id char(4),cname varchar(30),teacher_id char(6)
constraint PK_teach_course primary key(course_id)
constraint FK_teach_course foreign key(teacher_id)
references listen_course(teacher_id)
)
--外键 ’FK_listen_course’ 引用了无效的表 ’teach_course’
create table listen_course (
teacher_id char(6),tname varchar(20),course_id char(4)
constraint PK_listen_course primary key(teacher_id)
)
create table teach_course(
course_id char(4),cname varchar(30),teacher_id char(6)
constraint PK_teach_course primary key(course_id)
constraint FK_teach_course foreign key(teacher_id)
references listen_course(teacher_id)
)
alter table listen_course
add constraint FK_listen_course foreign key(course_id)
references teach_course(course_id);
2.3.3内容:
(1)创建worker表,并自定义两个约束U1以及U2,其中U1规定Name字段唯一,U2规定sage(级别)字段的上限是28.
(2)在worker表中插入一条合法记录。
(3)演示插入违反U2约束的例子。
(4)去除U2约束
(5)重新插入(3)中想要插入的数据,由于去除了U2约束,所以插入成功。
(6)创建规则rule_sex,规定插入或更新的值只能是M或F,并绑定到worker的sex字段
(7)演示违反规则rule_sex的插入操作。
代码:
--2.3 用户自定义完整性
Create Table Worker(
Number char(5),
Name char(8) constraint U1 unique,
Sex char(1),
Sage int constraint U2 check (Sage<=28),
Department char(20),
constraint PK_Worker Primary Key (Number))
--创建Worker表,并自定义两个约束u1以及u2,其中u1规定Name字段唯一,u2规定sage(级别)字段的上限是28
Insert into Worker(Number,Name,Sex,Sage,Department) Values(’00001’,’李勇’,’M’,14,’科技部’)
Select * From Worker
--在Worker表中插入一条合法记录
Insert into Worker(Number,Name,Sex,Sage,Department) Values(’00002’,’王勇’,’M’,38,’科技部’)
Select * From Worker
--演示插入违反u2约束的例子,u2规定元组的sage属性的值必须小于等于28
Alter table worker Drop U2
--去除u2约束
Insert into Worker(Number,Name,Sex,Sage,Department) Values(’00002’,’王勇’,’M’,38,’科技部’)
select * from worker
--重新插入(3)中想要插入的数据,由于去除了u2约束,所以插入成功
go
create rule rule_sex as @value in (’F’,’M’)
go
exec sp_bindrule rule_sex ,’worker.[sex]’;
--创建规则rule_sex,规定插入或更新的值只能是M或F,并绑定到Worker的sex字段
insert into worker values (’00003’,’王浩’,’1’,’25’,’研发部’);
--演示违反规则rule_sex的插入操作
2.4.3内容:
(1)为worker表建立触发器T1,当插入或是更新表中数据时,保证所操作的记录的sage值大于0
(2)为worker表建立触发器T2,禁止删除编号为00001的CEO。
(3)worker表中的人员编号是不可能改变的,创建触发器T3实现更新中编号的不可改变性。
(4)演示违反T1触发器的约束的插入操作
(5)演示违反T1触发器的约束的更新操作
(6)演示违反T2触发器的约束的插入操作
(7)演示违反T2触发器的约束的更新操作
(8)演示INSTEAD OF触发器在不可更新视图上的运用。
代码:
--2.4触发器·
go
create trigger T1 on worker
for insert , update
as
if (select sage from inserted)<1
begin
print ’Sage must be a integer more than zero! Tansaction fail’
Rollback transaction
End
--为worker表建立触发器T1,当插入或是更新表中数据时,保证所操作的记录的sage值大于0
go
create trigger T2 on worker
for delete
as
if (select number from deleted)=’00001’
begin
print ’He is the CEO!Delete Fail!’
Rollback transaction
End
--为worker表建立触发器T2,禁止删除编号为00001的CEO
go
create trigger T3 on Worker
for update
as
if update(number)
begin
print ’Everynumber cannot be changed!’
Rollback Transaction
End
--worker表中的人员的编号是不可改变的,创建触发器T3实现更新中编号的不可改变性
insert into worker values (’00003’,’李红’,’F’,-10,’开发部’)
--演示违反T1触发器的约束的插入操作
update worker set sage=-7 where number=’00001’
--演示违反T1触发器的约束的更新操作
delete from worker where name=’李勇’
--演示违反T2触发器的约束的插入操作
update worker set number=’00007’ where sex=’F’
--演示违反T2触发器的约束的更新操作
create view studentscholarship AS
select st.sid,st.sname,st.grade,sc.r_money
from Students st,Scholarship sc
where st.sid= sc.stu_id
--演示INSTEAD OF触发器在不可更新视图上的运用