数据库完整性实验教学

发布时间:2025-01-09 15:21

利用跨库搜索,如Ecosis链接不同数据库以获取完整文献 #生活技巧# #学习技巧# #学术论文检索技巧#

数据库实验课作业 1

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触发器在不可更新视图上的运用

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296

网址:数据库完整性实验教学 https://www.yuejiaxmz.com/news/view/676830

相关内容

PostgreSQL数据库性能压力测试实验
Python SQLAlchemy与数据库交互操作完整指南
如何高效整理数据库
现实生活中什么是数据库
生活中数据库如何应用
数据库管理系统,数据库在生活中的实例
Oracle数据库日常管理与维护技巧:提升SQL性能与数据安全
Oracle数据库数据安全面面观
完整图书馆管理系统(包含设计思路、图形界面、后台数据库)
大数据教育智能化与个性化学习

随便看看