MySQL触发器详解
一、介绍
大家应该都听过MySQL
的触发器,它的概念如下
它是一种特殊的一种存储过程,当表数据发生了新增、更新、删除时,便触发这个存储过程。
由此,故而名为触发器。下面一起来看看触发器的使用吧!
二、语法
1)语法格式
代码语言:javascript复制-- 删除
drop trigger 触发器名;
-- 定义结束符号
delimiter $$
-- 创建
create trigger 触发器名 before|after insert|update|delete on 表名 for each row
begin
执行语句
end$$
-- 定义结束符号
delimiter ;
- 触发事件类型
- insert:有数据新增时触发
- update:有数据被修改时触发
- delete:有数据被删除时触发
- 执行顺序
- before:在触发事件前执行语句
- after:在触发事件后执行语句
在执行语句中,和正常的存储过程差不多,不过触发器多了两个存储过程没有的对象,分别是
NEW
和OLD
; OLD:代表着更新,删除前的数据,可以通过OLD.字段名
来获取以前的值 NEW:代表着新增,更新后的数据,可以通过NEW.字段名
来获取以后的值 其中同上描述的,新增类型的触发器没有OLD
,删除类型的触发器没有NEW
,而更新触发器两者都有
好的,经过语法的介绍,直接进入实战;
2)示例
首先来一张用户表,需求很简单,如果年龄小于12岁时,将报错不允许操作
代码语言:javascript复制CREATE TABLE `sys_user_info` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` varchar(255) DEFAULT NULL COMMENT '姓名',
`age` tinyint(4) DEFAULT NULL COMMENT '年龄',
`gender` tinyint(1) DEFAULT NULL COMMENT '性别',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
那么,如何使用触发器完成这上面这个功能需求呢?具体触发器如下
代码语言:javascript复制DROP TRIGGER IF EXISTS `user_info_insert`;
DROP TRIGGER IF EXISTS `user_info_update`;
delimiter $$
CREATE TRIGGER `user_info_insert` AFTER INSERT ON `sys_user_info` FOR EACH ROW
BEGIN
IF NEW.age<12 THEN
SIGNAL SQLSTATE 'BY000' SET MESSAGE_TEXT = '年龄不能低于12岁';
END IF;
END$$
CREATE TRIGGER `user_info_update1` AFTER UPDATE ON `sys_user_info` FOR EACH ROW
BEGIN
IF NEW.age!=OLD.age and NEW.age<12 THEN
SIGNAL SQLSTATE 'BY000' SET MESSAGE_TEXT = '年龄不能低于12岁';
END IF;
END$$
delimiter ;
创建完成后,我们查看效果
三、最后
虽然触发器有着自己的局限性,但从某一个角度上来说,它确实是一个好东西。
在我经历的这段时间,它可以完成以下这些实用功能
- 表数据历史的收集,作为一个历史数据保存至其他历史表中。
- 某些数据通过判断后,来确定一些状态字段的值。
- 触发检测,是否达到预警,从而发送告警事件
触发器的功能也可以做到许多东西,关键看自己如何去进行使用,搭配代码,事半功倍!
我是半月,祝你幸福!!!