数据库Mysql高级——触发器和游标
程序员文章站
2022-03-03 21:01:43
...
以下是本篇文章正文内容
一、触发器简介?
触发器是和表关联的特殊的存储过程,可以在插入,删除或修改表中的数据时触发执行,比数据库本身标准的功能有更精细和更复杂的数据控制能力。
1.触发器优点
1)安全性
2)审计
3)实现复杂的数据完整性规则
4)提供了运行计划任务的另一种方法
二、MySQL 中使用触发器
1.触发器的四要素
监控地点:table
监控事件:insert/update/delete
触发时间:after/before
触发事件:insert/update/delete
2.创建触发器的基本语法
CREATE TRIGGER trigger_name trigger_time trigger_event ON
tb_name FOR EACH ROW trigger_stmt
--------------------------------------------------------
trigger_name:触发器的名称
tirgger_time:触发时机,为 BEFORE 或者 AFTER
trigger_event:触发事件,为 INSERT、DELETE 或者 UPDATE
tb_name:表示建立触发器的表名,在哪张表上建立触发器
trigger_stmt:触发器的程序体,可以是一条 SQL 语句或者是用 BEGIN 和 END 包含的多条语句
FOR EACH ROW 表示任何一条记录上的操作满足触发事件都会触发该触发器
注意:对同一个表相同触发时间的相同触发事件,只能定义一个触发器
3.案例
如你正在开发一个网上购物的应用,使用的数据库(shop)中有一张商品表(product)和订单表(orders),表结构及测试数据。代码如下:
CREATE TABLE `orders` (
`oid` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号',
`pid` int(11) NOT NULL COMMENT '商品编号',
`num` int(11) NOT NULL COMMENT '购买数量',
PRIMARY KEY (`oid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `product` (
`pid` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品编号',
`pname` varchar(255) NOT NULL COMMENT '商品名称',
`num` int(11) NOT NULL COMMENT '库存',
PRIMARY KEY (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `product` VALUES ('1', 'p30', '10');
INSERT INTO `product` VALUES ('2', 'mate20', '50');
INSERT INTO `product` VALUES ('3', 'nova5', '100');
1)当用户购买 p30 时,同时更新 p30 库存记录
create trigger mytg1
before insert on orders
for each row
begin
declare n int default 0; -- 定义一个变量
-- 查询库存
select num into n from product where pid = new.pid;
if new.num>n THEN -- 判断购买的数量是否大于库存
set new.num=n;-- 1)让购买的数量等于库存
end if;
update product set num = num-new.num where pid=new.pid;-- 更新库存
end;
-- 往订单表插入记录
insert into orders value(null,3,200);
drop trigger mytg1;
当用户删除订单时,同时更新对应的商品库存记录
create trigger mytg2
after delete on orders
for each ROW
begin
update product set num=num+old.num where pid=old.pid;
end;
delete from orders where oid=3;
查询数据
select * from orders;
select * from product;
三.游标
1、游标简介
游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作
特征:
1)游标是只读的,也就是不能更新它
2)游标是不能滚动的,也就是只能在一个方向上进行遍历,不能在记录之间随意进退,不能跳过某些记录
3)避免在已经打开游标的表上更新数据
2、MySQL 中游标的使用
创建游标:
定义游标:declare 游标名 cursor for select 语句
打开游标:open 游标名
获取结果:fetch 游标名 into 变量名[,变量名]
关闭游标:close 游标名
代码如下:
-- 定义过程
create PROCEDURE p1()
BEGIN
declare id int;
declare name varchar(20);
declare age int;
-- 声明游标
declare mc cursor for select * from student;
-- 打开游标
open mc;
-- 提取结果
FETCH mc into id,name,age;
-- 显示获取的结果
select id,name,age;
close mc;
end;
-- 调用过程
call p1();
以上就是今天要讲的内容
上一篇: 指定某一类型的文件在unity视图的打开软件(自需自改)
下一篇: 数据库表操作(2)
推荐阅读
-
MySQL数据库安装和Navicat for MySQL配合使用教程
-
mysql特点有哪些(mysql数据库特点和优势介绍)
-
什么是分表和分区 MySql数据库分区和分表方法
-
Yii实现MySQL多数据库和读写分离实例分析
-
MySQL数据库存储过程和事务的区别讲解
-
Mysql数据库的QPS和TPS的意义和计算方法
-
重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB
-
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
-
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
-
mysql题目和详细答案(2021数据库考试题及答案)