mysql触发器
我们先理解下为什么有触发器,用来干嘛的。沉下心来看完第一段再看后面的就感觉没啥难度了。(理解最重要)
触发器见名知意,不是用手来打开的是用脚来开启的。意思在于我们不是主动去进行调用而是我们执行特定的行为时去触发的;这个理解很关键,捕鼠器,捕兽夹,地雷这些东西。没有一种生物去愿意踩这玩意。除非脑子有泡。接下来就可以来看什么是触发器了
触发器创建的时候我们需要给出具体的 时间 , 地点,什么情况下, 要搞的事情,主要有以下这四个。
要素名字 | 要素参数 |
---|---|
地点(监控的表) | tableName(表名) |
事件(触发的情况) | insert/update/delete |
时间 | before/after |
解释:
地点:为为哪一个表添加触发器。
事件:为执行那种方法时,只能有增删改可以触发
时间:指的是在增删改操作之前还是之后
核心语句格式(第一边看肯定看起来很累,结合下面的demo就秒懂了):
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 表示任何一条记录上的操作满足触发事件都会触发该触发器。
注意:对同一个表相同触发时间和相同触发事件,只能定义一个触发器。(也就是说,一个表在不同的事件和时间上最后只能有六个触发器,增加前,增加后,修改前,修改后,删除前,删除后),补充: 触发器中的sql为一个事物,在begin和end中要么都成功要么都失败 (什么是事物?)
案例Demo
-- 注意 DELIMITER $$ 的使用 不懂看存储过程的那篇
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');
-- 创建触发器
DELIMITER $$
CREATE TRIGGER mytg1 AFTER INSERT ON product FOR EACH ROW
-- 如果语句只有一行 可以直接写在 FOR EACH ROW 后面可以不用 begin 和 end
BEGIN
update product set num = num+1 where pid=1;
END $$
DELIMITER;
-- 往商品表插入记录
INSERT INTO `product` VALUES ('4', 'nova5', '100');
-- 查询商品表商品库存更新情况
select * from product;
触发器中还可以声明临时变量;
理论部分
(结合开始的那就话很容易就理解了,对了 面试会问哦)
什么时触发器?
触发器是和表关联的特殊的存储过程,可以在插入,删除或修改表中的数据时触发执行,比数据库本身标准的功能有更精细和更复杂的数据控制能力。
触发器的优点(抄的别人的):
- SQL触发器提供了检查数据完整性的替代方法。
- SQL触发器可以捕获数据库层中业务逻辑中的错误。
- SQL触发器提供了运行计划任务的另一种方法。通过使用SQL触发器,您不必等待运行计划的任务,因为在对表中的数据进行更改之前或之后自动调用触发器。
- SQL触发器对于审核表中数据的更改非常有用。
触发器的缺点:
- 增加程序的复杂度,有些业务逻辑在代码中处理,有些业务逻辑用触发器处理,会使后期维护变得困难;
触发器的作用:
➢ 安全性:可以基于数据库的值使用户具有操作数据库的某种权利。例如不允许下班后和节假日修改数据库数据;
➢ 审计:可以跟踪用户对数据库的操作;
➢ 实现复杂的数据完整性规则。例如,触发器可回退任何企图吃进超过自己保证金的期货;
➢ 提供了运行计划任务的另一种方法。例如,如果公司的帐号上的资金低于 5 万元则立即给财务人员发送警告数据。
高级部分
新旧数据的处理
首先我们想一下,作为触发器在某时刻捕获到了一个sql语句。
语句: UPDATE table01 SET name = ‘李大麻子’ WHERE id = 1
原数据:原来id = 1 的name的值为 张大胆子
假如该语句执行时触发了触发器。那我们怎么表示新来的数据 ‘李大麻子’ 和原来的 ‘张大胆子’ 呢?
这就用到了 NEW 和 OLD 关键字了。
直接上代码
-- 创建表
CREATE TABLE `class` (
`cId` int(11) DEFAULT NULL,
`cName` varchar(30) DEFAULT NULL,
`tName` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
-- 该触发器为前置 在更新语句执行前触发的 new 代表着将要更新也就是新来的数据,old代表着原来的老数据
DELIMITER$$
CREATE TRIGGER table01_trigger BEFORE UPDATE ON `class`
FOR EACH ROW
BEGIN
-- 触发器 嫌弃李大麻子太丑不要他
IF NEW.`tName` = '李大麻子' THEN
SET NEW.`tName` = OLD.`tName`;
END IF;
END$$
DELIMITER ;
-- 执行 看看结果
UPDATE class SET tName = '李大麻子' WHERE `cId` = 1
-- 执行再 看看结果
UPDATE class SET tName = '隔壁老王' WHERE `cId` = 1
教程卒!