
1. 触发器
建立两个表:goods(商品表)、orders(订单表)
在商品表中导入商品记录
mysql> create database mydb16_trigger;
Query OK, 1 row affected (0.00 sec)mysql> use mydb16_trigger;
Database changed
mysql> create table goods(-> gid char(8) primary key,-> name varchar(10),-> price decimal(8,2),-> num int);
Query OK, 0 rows affected (0.01 sec)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);
Query OK, 0 rows affected (0.01 sec)mysql> insert into goods values-> ('A0001','橡皮',2.5,100),-> ('B0001','小楷本',2.8,210),-> ('C0001','铅笔',1.2,120),-> ('D0001','计算器',28,20);
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
建立触发器,订单表中增加订单数量后,商品表商品数量同步减少对应的商品订单出数量,并测试
mysql> create trigger orders_after_insert_trigger-> after insert on orders for each row-> update goods set num = num-new.onum-> where gid = new.gid;
Query OK, 0 rows affected (0.00 sec)
测试
mysql> select * from goods;
+-------+--------+-------+------+
| gid | name | price | num |
+-------+--------+-------+------+
| A0001 | 橡皮 | 2.50 | 100 |
| B0001 | 小楷本 | 2.80 | 210 |
| C0001 | 铅笔 | 1.20 | 120 |
| D0001 | 计算器 | 28.00 | 20 |
+-------+--------+-------+------+
4 rows in set (0.00 sec)mysql> insert into orders(gid,name,price,onum,otime) value('C0001','铅笔',1.
2,80,now());
Query OK, 1 row affected, 1 warning (0.00 sec)mysql> select * from goods;
+-------+--------+-------+------+
| gid | name | price | num |
+-------+--------+-------+------+
| A0001 | 橡皮 | 2.50 | 100 |
| B0001 | 小楷本 | 2.80 | 210 |
| C0001 | 铅笔 | 1.20 | 40 |
| D0001 | 计算器 | 28.00 | 20 |
+-------+--------+-------+------+
4 rows in set (0.00 sec)mysql> select * from orders;
+-----+-------+------+-------+------+------------+
| oid | gid | name | price | onum | otime |
+-----+-------+------+-------+------+------------+
| 1 | C0001 | 铅笔 | 1.20 | 80 | 2024-07-26 |
+-----+-------+------+-------+------+------------+
1 row in set (0.00 sec)
建立触发器,实现功能:客户取消订单,恢复商品表对应商品的数量
mysql> create trigger orders_after_delete_trigger-> after delete on orders for each row-> update goods set num=num+old.onum-> where gid=old.gid;
Query OK, 0 rows affected (0.00 sec)
测试
mysql> select * from goods;
+-------+--------+-------+------+
| gid | name | price | num |
+-------+--------+-------+------+
| A0001 | 橡皮 | 2.50 | 100 |
| B0001 | 小楷本 | 2.80 | 210 |
| C0001 | 铅笔 | 1.20 | 40 |
| D0001 | 计算器 | 28.00 | 20 |
+-------+--------+-------+------+
4 rows in set (0.00 sec)mysql> select * from orders;
+-----+-------+------+-------+------+------------+
| oid | gid | name | price | onum | otime |
+-----+-------+------+-------+------+------------+
| 1 | C0001 | 铅笔 | 1.20 | 80 | 2024-07-26 |
+-----+-------+------+-------+------+------------+
1 row in set (0.00 sec)mysql> delete from orders where gid = 'C0001';
Query OK, 1 row affected (0.00 sec)mysql> select * from goods;
+-------+--------+-------+------+
| gid | name | price | num |
+-------+--------+-------+------+
| A0001 | 橡皮 | 2.50 | 100 |
| B0001 | 小楷本 | 2.80 | 210 |
| C0001 | 铅笔 | 1.20 | 120 |
| D0001 | 计算器 | 28.00 | 20 |
+-------+--------+-------+------+
4 rows in set (0.00 sec)
建立触发器,实现功能:客户修改订单,商品表对应商品数量同步更新
mysql> select *from goods;
+-------+--------+-------+------+
| gid | name | price | num |
+-------+--------+-------+------+
| A0001 | 橡皮 | 2.50 | 100 |
| B0001 | 小楷本 | 2.80 | 210 |
| C0001 | 铅笔 | 1.20 | 120 |
| D0001 | 计算器 | 28.00 | 20 |
+-------+--------+-------+------+
4 rows in set (0.00 sec)mysql> select * from orders;
Empty set (0.00 sec)mysql> insert into orders(gid,name,price,onum,otime) value('A0001','橡皮',2.
5,20,now());
Query OK, 1 row affected, 1 warning (0.00 sec)mysql> select *from goods;
+-------+--------+-------+------+
| gid | name | price | num |
+-------+--------+-------+------+
| A0001 | 橡皮 | 2.50 | 80 |
| B0001 | 小楷本 | 2.80 | 210 |
| C0001 | 铅笔 | 1.20 | 120 |
| D0001 | 计算器 | 28.00 | 20 |
+-------+--------+-------+------+
4 rows in set (0.00 sec)mysql> select * from orders;
+-----+-------+------+-------+------+------------+
| oid | gid | name | price | onum | otime |
+-----+-------+------+-------+------+------------+
| 2 | A0001 | 橡皮 | 2.50 | 20 | 2024-07-26 |
+-----+-------+------+-------+------+------------+
1 row in set (0.00 sec)mysql> update orders set onum = 35 where gid = 'A0001';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select *from goods;
+-------+--------+-------+------+
| gid | name | price | num |
+-------+--------+-------+------+
| A0001 | 橡皮 | 2.50 | 65 |
| B0001 | 小楷本 | 2.80 | 210 |
| C0001 | 铅笔 | 1.20 | 120 |
| D0001 | 计算器 | 28.00 | 20 |
+-------+--------+-------+------+
4 rows in set (0.00 sec)mysql> select * from orders;
+-----+-------+------+-------+------+------------+
| oid | gid | name | price | onum | otime |
+-----+-------+------+-------+------+------------+
| 2 | A0001 | 橡皮 | 2.50 | 35 | 2024-07-26 |
+-----+-------+------+-------+------+------------+
1 row in set (0.00 sec)
2.存储过程
使用mydb7 openlab库
创建提取emp_new表所有员工姓名和工资的存储过程s1
mysql> delimiter $$
mysql> create procedure s1()-> begin-> select name,incoming from emp_new;-> end $$
Query OK, 0 rows affected (0.01 sec)mysql> delimiter ;
mysql> call s1();
创建存储过程s2,实现输入员工姓名后返回员工的年龄
mysql> delimiter $$
mysql> create procedure s3(in in_dept int,out avg_sal float)-> begin-> select avg(incoming) into avg_sal from emp_new where dept2=in_dept;-> end $$
创建一个存储过程s3,有2个参数,传入部门号,返回该部门的平均工资
mysql> delimiter $$
mysql> create procedure s3(in in_dept int,out avg_sal float)-> begin-> select avg(incoming) into avg_sal from emp_new where dept2=in_dept;-> end $$