一、题目
二、运行过程
一、触发器
1、建立两个表:goods(商品表)、orders(订单表)
mysql> create table goods(
-> gid char(8) primary key,
-> name varchar(10),
-> price decimal(8,2),
-> num int);
mysql> create table orders(
-> oid int primary key auto_increment,
-> gid char(10) not null,
-> name varchar(10),
-> price decimal(8,2),
-> onum int,
-> otime date);
2、在商品表中导入商品记录
mysql> insert into goods values
-> (‘A0001’, ‘橡皮’, 2.5, 100),
-> (‘B0001’, ‘小楷本’, 2.8, 210),
-> (‘C0001’, ‘铅笔’, 1.2, 120),
-> (‘D0001’, ‘计算器’, 28, 20);
3、建立触发器,订单表中增加订单数量后,商品表商品数量同步减少对应的商品订单出数量,并测试
mysql> delimiter
m
y
s
q
l
>
c
r
e
a
t
e
t
r
i
g
g
e
r
r
e
d
u
c
e
g
o
o
d
s
n
u
m
−
>
a
f
t
e
r
i
n
s
e
r
t
o
n
o
r
d
e
r
s
−
>
f
o
r
e
a
c
h
r
o
w
−
>
b
e
g
i
n
−
>
u
p
d
a
t
e
g
o
o
d
s
−
>
s
e
t
n
u
m
=
n
u
m
−
n
e
w
.
o
n
u
m
−
>
w
h
e
r
e
g
i
d
=
n
e
w
.
g
i
d
;
−
>
e
n
d
mysql> create trigger reduce_goods_num -> after insert on orders -> for each row -> begin -> update goods -> set num = num - new.onum -> where gid = new.gid; -> end
mysql>createtriggerreducegoodsnum−>afterinsertonorders−>foreachrow−>begin−>updategoods−>setnum=num−new.onum−>wheregid=new.gid;−>end
mysql> delimiter ;
mysql> insert into orders (gid, name, price, onum, otime) values (‘a0001’, ‘橡皮’, 2.5, 10, curdate());
4、建立触发器,实现功能:客户取消订单,恢复商品表对应商品的数量
mysql> delimiter
m
y
s
q
l
>
c
r
e
a
t
e
t
r
i
g
g
e
r
r
e
s
t
o
r
e
g
o
o
d
s
n
u
m
−
>
a
f
t
e
r
d
e
l
e
t
e
o
n
o
r
d
e
r
s
−
>
f
o
r
e
a
c
h
r
o
w
−
>
b
e
g
i
n
−
>
u
p
d
a
t
e
g
o
o
d
s
−
>
s
e
t
n
u
m
=
n
u
m
+
o
l
d
.
o
n
u
m
−
>
w
h
e
r
e
g
i
d
=
o
l
d
.
g
i
d
;
−
>
e
n
d
mysql> create trigger restore_goods_num -> after delete on orders -> for each row -> begin -> update goods -> set num = num + old.onum -> where gid = old.gid; -> end
mysql>createtriggerrestoregoodsnum−>afterdeleteonorders−>foreachrow−>begin−>updategoods−>setnum=num+old.onum−>wheregid=old.gid;−>end
mysql> delimiter ;
mysql> delete from orders where oid = 1;
Query OK, 1 row affected (0.00 sec)
5、建立触发器,实现功能:客户修改订单,商品表对应商品数量同步更新
mysql> delimiter
m
y
s
q
l
>
c
r
e
a
t
e
t
r
i
g
g
e
r
u
p
d
a
t
e
g
o
o
d
s
n
u
m
−
>
a
f
t
e
r
u
p
d
a
t
e
o
n
o
r
d
e
r
s
−
>
f
o
r
e
a
c
h
r
o
w
−
>
b
e
g
i
n
−
>
d
e
c
l
a
r
e
q
u
a
n
t
i
t
y
c
h
a
n
g
e
i
n
t
;
−
>
s
e
t
q
u
a
n
t
i
t
y
c
h
a
n
g
e
=
o
l
d
.
o
n
u
m
−
n
e
w
.
o
n
u
m
;
−
>
u
p
d
a
t
e
g
o
o
d
s
−
>
s
e
t
n
u
m
=
n
u
m
+
q
u
a
n
t
i
t
y
c
h
a
n
g
e
−
>
w
h
e
r
e
g
i
d
=
n
e
w
.
g
i
d
;
−
>
e
n
d
mysql> create trigger update_goods_num -> after update on orders -> for each row -> begin -> declare quantity_change int; -> set quantity_change = old.onum - new.onum; -> update goods -> set num = num + quantity_change -> where gid = new.gid; -> end
mysql>createtriggerupdategoodsnum−>afterupdateonorders−>foreachrow−>begin−>declarequantitychangeint;−>setquantitychange=old.onum−new.onum;−>updategoods−>setnum=num+quantitychange−>wheregid=new.gid;−>end
mysql> delimiter ;
mysql> update orders set onum = 5 where oid = 1;
二、存储过程
1、使用mydb7 openlab库
mysql> use mydb7_openlab;
2、创建提取emp_new表所有员工姓名和工资的存储过程s1
mysql> delimiter
m
y
s
q
l
>
c
r
e
a
t
e
p
r
o
c
e
d
u
r
e
s
1
(
)
−
>
b
e
g
i
n
−
>
s
e
l
e
c
t
n
a
m
e
,
s
a
l
a
r
y
f
r
o
m
e
m
p
n
e
w
;
−
>
e
n
d
mysql> create procedure s1() -> begin -> select name, salary from emp_new; -> end
mysql>createprocedures1()−>begin−>selectname,salaryfromempnew;−>end
mysql> delimiter ;
mysql> call s1();
3、创建存储过程s2,实现输入员工姓名后返回员工的年龄
mysql> delimiter
m
y
s
q
l
>
c
r
e
a
t
e
p
r
o
c
e
d
u
r
e
s
2
(
i
n
e
m
p
n
a
m
e
v
a
r
c
h
a
r
(
50
)
)
−
>
b
e
g
i
n
−
>
s
e
l
e
c
t
t
i
m
e
s
t
a
m
p
d
i
f
f
(
y
e
a
r
,
b
i
r
t
h
d
a
y
,
c
u
r
d
a
t
e
(
)
)
a
s
a
g
e
−
>
f
r
o
m
e
m
p
n
e
w
−
>
w
h
e
r
e
n
a
m
e
=
e
m
p
n
a
m
e
;
−
>
e
n
d
mysql> create procedure s2(in emp_name varchar(50)) -> begin -> select timestampdiff(year, birthday, curdate()) as age -> from emp_new -> where name = emp_name; -> end
mysql>createprocedures2(inempnamevarchar(50))−>begin−>selecttimestampdiff(year,birthday,curdate())asage−>fromempnew−>wherename=empname;−>end
mysql> delimiter ;
mysql> call s2(‘员工姓名’);
4、创建一个存储过程s3,有2个参数,传入部门号,返回该部门的平均工资
mysql> delimiter
m
y
s
q
l
>
c
r
e
a
t
e
p
r
o
c
e
d
u
r
e
s
3
(
i
n
d
e
p
t
i
d
i
n
t
,
o
u
t
a
v
g
s
a
l
a
r
y
d
e
c
i
m
a
l
(
8
,
2
)
)
−
>
b
e
g
i
n
−
>
s
e
l
e
c
t
a
v
g
(
s
a
l
a
r
y
)
i
n
t
o
a
v
g
s
a
l
a
r
y
−
>
f
r
o
m
e
m
p
n
e
w
−
>
w
h
e
r
e
d
e
p
t
i
d
=
d
e
p
t
i
d
;
−
>
e
n
d
mysql> create procedure s3(in dept_id int, out avg_salary decimal(8, 2)) -> begin -> select avg(salary) into avg_salary -> from emp_new -> where dept_id = dept_id; -> end
mysql>createprocedures3(indeptidint,outavgsalarydecimal(8,2))−>begin−>selectavg(salary)intoavgsalary−>fromempnew−>wheredeptid=deptid;−>end
mysql> delimiter ;
mysql> set @avg_salary = 0;
mysql> call s3(部门号, @avg_salary);
mysql> select @avg_salary;
三、运行结果
一、触发器
1、建立两个表:goods(商品表)、orders(订单表)