MySQL-存储过程与触发器

目标

本实验任务是掌握MySQL数据库编程技术,学会独立编写和调试存储过程和触发器

打开 MySQL 服务

sudo service mysql start

#使用 root 用户登录,输入密码

mysql -u root -p

后续的实验都在 MySQL 的控制台输入命令进行操作。

功能描述

1.图书信息表(book)

字段名称 数据类型 是否可为空

图书编号(PK) varchar(20) 否

书名 varchar(50) 否

作者 varchar(12) 否

出版社 varchar(50) 是

出版日期 date 是

简介 varchar(200) 是

2.读者信息表(student)

字段名称 数据类型 是否可为空

读者学号(PK) int 否

读者姓名 varchar(10) 否

读者性别(男/女) varchar(3) 否

所在系 varchar(12) 否

生效时间 date 是

失效时间 date 是

累计借书量 int 是

3.借阅表(borrow)

字段名称 数据类型 是否可为空

读者学号 int 否

图书编号 varchar(20) 否

借书日期 date 否

还书日期 date 是

根据上述表结构完成任务。

分析

  1. 创建一个存储过程,传入一个读者姓名,以输出参数的形式返回借了多少本书。
  2. 调用上述存储过程,检索张延借了多少本书。
  3. 在读者信息表上建立触发器,删除某个读者信息时,删除借阅表中相应的记录。

步骤

  1. 连接数据库,新建SQL窗口,创建测试表,插入测试数据:

#创建测试表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
create table book(
bno varchar(20) primary key,
bname varchar(50) not null,
author varchar(12) not null,
publisher varchar(50),
pubdate date,
common varchar(200));
create table student(
sno int primary key,
sname varchar(10) not null,
sex varchar(3) not null,
dept varchar(12) not null,
sdate date,
edate date,
total int);
create table borrow(
sno int not null,
bno varchar(20) not null,
startdate date,
enddate date);
#插入测试数据
insert into book values('c0001','琴岛帆影','郭同文','作家出版社','2008-08-01',null);
insert into book values('c0002','网页制作案例教程','高林','人民邮电出版社','2008-05-01',null);
insert into book values('c0003','PhotoshopCS2版','王燕南','北京艺术与科学电子出版社','2008-12-28',null);
insert into book values('c0004','计算机组成原理','王爱英','清华大学出版社','2001-01-03',null);
insert into book values('c0005','c语言程序设计','谭浩强','清华大学出版社','2002-04-02',null);
insert into book values('c0006','计算机提结构','石教英','浙江大学出版社','2004-10-03',null);
insert into student values(1001,'刘晨','男','计算机系','2009-09-20','2010-12-31',null);
insert into student values(1002,'张克非','男','计算机系','2009-05-26','2010-08-06',null);
insert into student values(1003,'李菲菲','女','通信系','2009-06-08','2010-09-07',null);
insert into student values(1004,'张延','男','信息工程','2009-03-01','2010-06-07',null);
insert into borrow values('1001','c0004','2009-10-09',null);
insert into borrow values('1002','c0001','2009-06-07',null);
insert into borrow values('1002','c0005','2009-06-07',null);
insert into borrow values('1004','c0006','2009-04-05',null);
insert into borrow values('1004','c0002','2009-08-09',null);
insert into borrow values('1004','c0003','2009-08-09',null);

  1. 创建一个存储过程,传入一个读者姓名,以输出参数的形式返回借了多少本书:
1
2
3
4
CREATE DEFINER=`root`@`localhost` PROCEDURE `p_select`(in name varchar(10), out num int)
BEGIN
select count(bno) into num from borrow where sno=(select sno from student where sname=name);
END

  1. 调用上述存储过程,检索张延借了多少本书:
1
2
call p_select('张延',@num);
select @num;

  1. 在读者信息表上建立触发器,删除某个读者信息时,删除借阅表中相应的记录:
1
2
3
4
5
6
7
8
9
DELIMITER $$
CREATE
TRIGGER `mysql_demo`.`p_trii` AFTER DELETE
ON `mysql_demo`.`student`
FOR EACH ROW
BEGIN
delete from borrow where sno=old.sno;
END$$
DELIMITER ;
  1. 删除编号为1004的读者信息后查看借阅信息表:


原始的借阅信息表

1
2
delete from student where sno=1004;
select * from borrow;


删除读者信息后的借阅信息表