数据库实验报告
数据库实验报告一
完整性语言
实验目的:
掌握实体完整性,参照完整性,用户自定义完整性的定义和维护方法。
实验器材:
计算机
Microsoft SQL Server Management Studio 18
SQL Sever 2019
实验内容:
1.实体完整性实验:
定义实体完整性,删除实体完整性,能够写出两种方式定义实体完整性的SQL语句;创建表时定义实体完整性,创建表后定义实体完整性。设计SQL语句验证完整性约束是否起作用。
2.参照完整性实验:
定义参照完整性,定义参照完整性的违约处理,删除参照完整性。写出两种方式定义参照完整性的SQL语句:创建表时定义参照完整性,创建表后定义参照完整性。
3.用户自定义完整性实验:
针对具体应用语义,选择NULL/NOT NULL、DEFAUKLT、UNIQUE、CHECK等,定义属性上的约束条件。
实验步骤:
一.实体完整性:
创建表时定义实体完整性(列级):
/**创建表时定义实体完整性(列级实体完整性)*/
create table student
( Sno char(20) primary key,
Sname char(20) not null,
Ssex char(2),
Sage smallint,
Sdept char(20)
);
创建表时定义实体完整性(表级):
/*建表时定义/
create table student
( Sno char(20),
Sname char(20) not null,
Ssex char(2),
Sage smallint,
Sdept char(20),
primary key(Sno)
);
建表后定义实体完整性:
/*建表后定义/
create table student
( Sno char(20),
Sname char(20) not null,
Ssex char(2),
Sage smallint,
Sdept char(20)
);
alter table student add primary key (Sno);
定义实体完整性(主码由多个属性构成):
/**定义实体完整性(主码由多个属性构成)*/
create table ssc
( Sno char(9) not null,
Cno char(4) not null,
Grade smallint,
primary key (Sno,Cno)
);
有多个候选码时定义实体完整性:
/*有多个候选码时定义实体完整性/
/定义课程表的实体完整性,其中Cno和Cname都是候选码,选择Cno作为主码,Cname上定义唯一约束性unique。/
create table course
( Cno char(4) constraint key_course primary key,
Cname char(10) unique,
Cpno smallint,
Ccredit smallint
);
删除实体完整性:
/删除实体完整性/
/删除课程实体的主码/
alter table course drop constraint key_course ;
验证实体完整性:
/增加两条相同记录,验证实体完整性是否起作用/
insert into Student values (‘201802819’,‘张三’,‘男’,30,‘CS’);
insert into Student values (‘201802819’,‘李四’,‘男’,30,‘CS’);
违反了 PRIMARY KEY 约束“PK__Student__DDDF64460B654731”。不能在对象“dbo.Student”中插入重复键。重复键值为 (201802819)。
二.参照完整性实验:
创建表时定义参照完整性
关系sc中(Sno,Cno)是主码。Sno,Cno分别参照student表的主码和course表的主码
create table ssc
( Sno char(20) NOT NULL,
Cno char(4) NOT NULL,
Grade smallint,
primary key (Sno, Cno),
foreign key (Sno) references student(Sno),
foreign key (Cno) references course(Cno)
);
创建表后定义参照完整性
/创建表后定义参照完整性
定义SC表的参照完整性/
create table ssc
( Sno char(20) NOT NULL,
Cno char(4) NOT NULL,
Grade smallint,
primary key (Sno, Cno)
);
alter table ssc add constraint FK_SC_Sno foreign key(Sno) references Psstudent(Sno);
alter table ssc add constraint FK_SC_Cno foreign key(Cno) references ccourse(Cno);
sc、student、course表的关系如下:
定义参照完整性(外码由多个属性组成)
/创建一个老师表,其中系与老师编号一起作为老师表的主码,创建一个薪资表,薪资号作为主码,系与老师编号作为薪资表的外码/
create table Teacher
( Tno char(9) ,
Tname char(20),
Cno char(4),
Sdept char(20),
primary key(Sdept,Tno)
)
create table Salary
( Sno char(9) primary key,
Tno char(9) ,
Sdept char(20),
foreign key(Sdept,Tno) references Teacher(Sdept,Tno)
)
定义参照完整性的违约处理
/创建sc表当student表删除或更新Sno时sc表自动进行Sno的更新与删除,当course删除某一元组造成与sc不一致时拒绝删除,course的Cno更新时自动进行级联更新。/
create table sc
( Sno char(20) NOT NULL,
Cno char(4) NOT NULL,
Grade smallint,
primary key(Sno,Cno),
foreign key (Sno) references student(Sno)
on delete cascade
on update cascade,
foreign key (Cno) references course(Cno)
on delete no action /当删除ccourse 表中的元组造成了sscc表不一致时拒绝删除/
on update cascade
);
删除参照完整性
删除sc表中的外码
alter table ssc drop constraint FK_ssc_Sno;
alter table ssc drop constraint FK_ssc_Cno;
验证参照完整性
/插入三条记录来分别验证:/
/插入一个在student表中不存在的数据/
insert into sc
values(‘20180280’,’1’,10);
/插入一个在course表中不存在的数据/
insert into sc
values(‘20180281’,’10’,10);
/插入一个在Student表与Course中都存在的数据/
insert into sc
values(‘20180281’,’1’,10);
三.用户自定义完整性实验
(1)定义属性NULL/NOT NULL约束
定义Boss表各个属性的NULL/NOT NULL属性
create table Boss
( Bno char(9) not null primary key,
Bname char(20) not null,
Bage smallint not null,
Bdept char(20)
)
(2)定义属性DEFAULT约束
定义Staff表的Sworktime属性的缺省属性值为0,Sdept属性的缺省值为‘无’
create table Staff
( Sno char(9) not null primary key,
Sname char(20) not null,
Sage smallint not null,
SworkTime smallint default 0,
Sdept char(20) default ‘无’
)
(3)定义属性UNIQUE约束
定义dept表的Dname属性必须唯一的完整性约束
create table dept
( Dno char(9) not null primary key,
Dname char(20) UNIQUE,
Dcount smallint
)
(4)定义属性CHECK约束
/使用CHECK约束来定义NewStaff表的中的某些属性应满足的约束/
create table NewStaff
( Nno char(9) not null primary key,
Nname char(20) ,
Nsex char(2),
Nage smallint ,
Nsalary smallint,
check(Nage>20 and Nage<60),
check(Nsalary>2000),
check(Nsex in(‘男’,‘女’))
实验结果(附数据和图表):
实验一(实体完整性):
验证实体完整性:
/增加两条相同记录,验证实体完整性是否起作用/
insert into Student values (‘201802819’,‘张三’,‘男’,20,‘CS’);
insert into Student values (‘201802819’,‘李四’,‘男’,30,‘CS’);
实验二(参照完整性):
插入一个在student表中不存在的数据和插入一个在course表中不存在的数据都违反约束
插入都有的记录成功:
实验三:
插入数据的年龄不在20-60区间,违反了CHECK约束
满足双条件数据成功插入
实验结果分析及结论:
1.实体完整性实验:
成功定义实体完整性,删除实体完整性,列级定义实体完整性和创建表后确定主键、外键 定义实体完整性的SQL语句(表级,列级);创建表时定义实体完整性,创建表后定义实体完整性。完成了设计SQL语句验证完整性约束是否起作用的操作。
2.参照完整性实验:
成功定义参照完整性,定义参照完整性的违约处理,删除参照完整性。写出了两种方式定义参照完整性的SQL语句,创建表时定义参照完整性,创建表后定义参照完整性。
3.用户自定义完整性实验:
完成了针对具体应用语义,选择NULL/NOT NULL、DEFAUKLT、UNIQUE、CHECK等,定义属性上的约束条件。
实验心得体会和建议:
1.通过本次实验,理解了数据库完整性约束的概念,并且通过实验验证了数据库的完整性。
2.验证了实体完整性,参照完整性,以及用户自定义完整性并且加深了理解。
更加深刻的了解到了数据库,以及数据完整性的重要性。