MySQL-5-触发器和储存过程

一、题目

二、过程及结果截图

1、触发器

1)使用mydb16_trigger数据库,建立表

建表goods

建表orders

2)插入数据

3)建立触发器

(1)建立触发器,订单表中增加订单数量后,商品表商品数量同步减少对应的商品订单出数量,并测试

建立触发器

复制代码
mysql> delimiter //
mysql> create trigger orders_after_insert
    -> after insert on orders for each row
    -> begin
    ->      update goods set num=num-new.onum where gid=new.gid;
    -> end //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

测试:添加订单

复制代码
mysql> insert into orders(gid,name,price,onum,otime) values('A0001','橡皮',2.5,5,curdate());

测试结果:

(2)建立触发器,实现功能:客户取消订单,恢复商品表对应商品的数量

建立触发器

复制代码
mysql> delimiter //
mysql>
mysql> create trigger orders_after_delete_teigger
    -> after delete on orders for each row
    -> begin
    ->      update goods set num=num+old.onum where gid=old.gid;
    -> end //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;

测试:删除订单

复制代码
mysql> delete from orders where oid=1;

测试结果:

(3)建立触发器,实现功能:客户修改订单,商品表对应商品数量同步更新

建立触发器

复制代码
mysql> delimiter //
mysql> create trigger orders_after_update
    -> after update on orders for each row
    -> begin
    ->       update goods set num=num+old.onum where gid=old.gid;
    ->       update goods set num=num-new.onum where gid=new.gid;
    -> end //
Query OK, 0 rows affected (0.04 sec)

mysql> delimiter ;

测试:修改订单,先取消后添加

提前添加订单,'小楷本'10份

复制代码
mysql> insert into orders(gid,name,price,onum,otime) values('B0001','小楷本',2.8,10,curdate());

修改订单,'小楷本'15份

复制代码
mysql> update orders set onum=15 where oid=2;

测试结果:

2、储存过程

(1)使用mydb7 openlab库

复制代码
mysql> use mydb7_openlab ;

Database changed

(2)创建提取emp_new表所有员工姓名和工资的存储过程s

先查询emp_new表所有员工姓名和工资

成功后再创建s1

复制代码
mysql> delimiter //
mysql> create procedure s1()
    -> begin
    ->       select name 姓名,incoming 工资 from emp_new;
    -> end //
Query OK, 0 rows affected (0.03 sec)

mysql> delimiter ;

测试:

(3)创建存储过程s2,实现输入员工姓名后返回员工的年龄

先查询emp_new表"王五"的年龄

成功后再创建s2

复制代码
mysql> delimiter //
mysql> create procedure s2(in iname varchar(11),out oage int)
    -> begin
    ->       select age into oage from emp_new where name=iname;
    -> end //
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;

测试:

复制代码
mysql> call s2('王五',@oage);
Query OK, 1 row affected (0.00 sec)

(4)创建一个存储过程s3,有2个参数,传入部门号,返回该部门的平均工资

先查询emp_new表部门号101部门的平均工资

成功后再创建s3

复制代码
mysql> delimiter //
mysql> create procedure s3(in idept int,out avg_incoming decimal(8,2))
    -> begin
    ->       select avg(incoming) into avg_incoming from emp_new where dept2=idept;
    -> end //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

测试:

复制代码
mysql> call s3(101,@avg_inc);
Query OK, 1 row affected, 1 warning (0.00 sec)
相关推荐
q***33376 小时前
SpringMVC新版本踩坑[已解决]
android·前端·后端
4***576 小时前
数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(一).创建基础表
数据库·mysql·oracle
F***74176 小时前
数据库课设---酒店管理系统(MySQL、VBNet)
android·数据库·mysql
踢球的打工仔6 小时前
PHP面向对象(5)
android·java·php
1***t8277 小时前
MySQL 8.0安装
数据库·mysql·adb
U***74697 小时前
Linux(CentOS)安装 MySQL
linux·mysql·centos
3***g2057 小时前
Linux系统离线部署MySQL详细教程(带每步骤图文教程)
linux·mysql·adb
c***69307 小时前
使用mysql报Communications link failure异常解决
数据库·mysql
t***q337 小时前
关于Mysql 中 Row size too large (> 8126) 错误的解决和理解
数据库·mysql
i***t91916 小时前
Linux下MySQL的简单使用
linux·mysql·adb