实验报告( 2015 / 2016 学年第 2 学期)题目:数据库系统原理专业:物联网工程学生:班级学号:指导教师:指导单位:物联网学院日期: 2016-5-12实验名称:约束、视图、索引与存储过程一、 实验容和要求1、用create database 命令创建电影数据库(以自己的学号命名)。
2、在电影数据库中用create table 命令创建如下5个关系模式。
3、用alter table 命令修改movies 关系模式,增加引用完整性约束cproducerc ,要求movies 表中的producerC 必须是在MovieExec 表中已有的导演。
若违反了此约束,则拒绝更新操作。
4、用alter table 命令修改StarsIn 关系模式,增加引用完整性约束cmovies ,要求StarsIn 表中的电影名称和年份必须是在movies 表中已有的电影名称和年份。
若违反了此约束,则拒绝更新操作。
5、用alter table 命令修改movies 关系模式,增加完整性约束cyear ,要求电影年份不能是1915年以前的。
6、用alter table 命令修改movies 关系模式,增加完整性约束clength ,要求电影长度不能小于60也不能多于250。
7、设计数据对3~6的容进行验证。
8、用create view 命令创建如下视图。
a)视图RichExec 给出了所有资产在10000000以上的导演的、地址、证书号和资产;b)视图StudioPress 给出了既是电影公司经理又是导演的那些人的名字、地址和证书号;c)视图ExecutiveStar 给出了既是演员又是导演的那些人的名字、地址、性别、生日、证书号和资产总值。
9、用create index 命令在StarsIn 的StarName 属性上创建索引aindex 。
10、编写存储过程(函数)① 求产品数据库Laptop 存容量的平均值和总和。
然后调用该存储过程(函数)。
二、 实验环境PostGreSQL9.3三、 实验设计CREATE TABLE Movies ( title char(20), year int, length int, genre char(10), studioName char (30), producerC int, PRIMARY KEY (title, year ));CREATE TABLE MovieStar ( name char(12), address char(30), gender char(2), birthdate date, PRIMARY KEY (name ));CREATE TABLE StarsIn ( movieTitle char(20), movieYear int, starName char(12), PRIMARY KEY (movieTitle , movieYear , starName ));CREATE TABLE MovieExec ( name char(12), address char(30), cert int, netWorth int, PRIMARY KEY (cert ));CREATE TABLE Studio ( name char(30), address char(30), presC int, PRIMARY KEY (name ));说明:Movies 关系中,title 为电影名称、year 为发行年份、length 为电影长度(分钟)、genre 为电影流派、studioName 为电影公司名称、producerC 为导演证书号;MovieStar 关系中,name 为影星的姓名、address 为影星住址、gender 为性别、birthdate 为出生日期;StarsIn 关系中,movieTitle 为电影名称、movieYear 为发行年份、starName 为参演影星姓名;MovieExec 关系中,name 导演姓名、address 为住址、cert 为导演证书号、netWorth 为导演净资产值;Studio 关系中,name 为电影公司名称、address 为电影公司地址、presC 为电影公司老总证书号。
1、创建电影数据库B13070607,并创建5个数据表分别为movies、moviestar、starsin、movieexec、studio。
2、运行语句添加约束:①ALTER TABLE movies ADD CONSTRAINT cproducercFOREIGN KEY(producerC) references MovieExec(cert);②ALTER TABLE StarsIn ADD CONSTRAINT cmoviesFOREIGN KEY(movieTitle,movieYear) references movies(title,year);③ALTER TABLE movies ADD CONSTRAINT cyearCHEAK(year>=1915);④ALTER TABLE movies ADD CONSTRAINT clengthCHEAK(length>=60 AND length<=250);添加要求的视图和索引:⑤CREATE VIEW RichExec ASSELECT name,address,cert,netWorthFROM MovieExecWHERE netWorth>=10000000;⑥CREATE VIEW StudioPress ASSELECT ,MovieExec.address,certFROM MovieExec,StudioWHERE MovieExec.cert=Studio.presC;⑦CREATE VIEW ExecutiveStar ASSELECT , MovieExec.address,gender,birthdate,netWorthFROM MovieStar,MovieExecWHERE = AND MovieStar.address=MovieExec.address;⑧CREATE INDEX aindex ON StarsIn(StarName);3、调用存储过程(函数),求Laptop存容量的平均值和总和。
create function laptop() returns setof realas $$declare ramcount int :=0;sum int:=0;ramloop int;ave real ;beginfor ramloop inselect ram from laptoploopsum :=sum + ramloop;ramcount :=ramcount +1;end loop;ave :=sum/ramcount;return next sum;return next ave;end ;$$language plpgsql;四、实验步骤1、用create database命令创建电影数据库(以自己的学号命名)。
2、在电影数据库中用create table 命令创建如下5个关系模式。
3、用alter table命令修改movies关系模式,增加引用完整性约束cproducerc,要求movies表中的producerC必须是在MovieExec表中已有的导演。
若违反了此约束,则拒绝更新操作。
4、用alter table命令修改StarsIn关系模式,增加引用完整性约束cmovies,要求StarsIn表中的电影名称和年份必须是在movies表中已有的电影名称和年份。
若违反了此约束,则拒绝更新操作。
5、用alter table命令修改movies关系模式,增加完整性约束cyear,要求电影年份不能是1915年以前的。
6、用alter table命令修改movies关系模式,增加完整性约束clength,要求电影长度不能小于60也不能多于250。
7、设计数据对3~6的容进行验证。
8、用create view命令创建如下视图。
a)视图RichExec给出了所有资产在10000000以上的导演的、地址、证书号和资产;b)视图StudioPress给出了既是电影公司经理又是导演的那些人的名字、地址和证书号;c)视图ExecutiveStar给出了既是演员又是导演的那些人的名字、地址、性别、生日、证书号和资产总值。
9、用create index命令在StarsIn的StarName属性上创建索引aindex。
10、编写存储过程(函数)①求产品数据库Laptop存容量的平均值和总和。
然后调用该存储过程(函数)。
五、实验结果1、设计数据对3~6的容进行验证:⑴违反完整性约束cproducerc;⑵违反完整性约束cmovies⑶违反完整性约束cyear⑷违反完整性约束clength2、8a)创建视图RichExe8b)创建视图StudioPress8c)创建视图ExecutiveStar3、求产品数据库Laptop存容量的平均值和总和六、实验小结这次数据库实验主要考察了第七章的约束、第八章的视图还有9.4小节的存储过程。
虽然实验步骤较多,但是有了上次实验的基础,上手还是挺快的,约束和视图的建立比较简单,要注意的是设计数据时,要考虑到约束的条件,要保证当出现不符合约束的数据时,正确报错。
实验中比较困难的是调用存储过程求平均值和总和,书上的例子是用for循环计算长度的均值和方差,与实验的要求不一样,尝试着做了下,虽然查询成功,但是没有结果显示出来,不知道问题在哪里。
通过实验发现,存储过程这一节的容掌握的不好,还需要多加练习。