MySQL触发器详解

一、介绍

大家应该都听过MySQL的触发器,它的概念如下

它是一种特殊的一种存储过程,当表数据发生了新增、更新、删除时,便触发这个存储过程。

由此,故而名为触发器。下面一起来看看触发器的使用吧!

二、语法

1)语法格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 删除
drop trigger 触发器名;

-- 定义结束符号
delimiter $$

-- 创建
create trigger 触发器名 before|after insert|update|delete on 表名 for each row
begin
执行语句
end$$

-- 定义结束符号
delimiter ;
  • 触发事件类型

    • insert:有数据新增时触发
    • update:有数据被修改时触发
    • delete:有数据被删除时触发
  • 执行顺序

    • before:在触发事件前执行语句
    • after:在触发事件后执行语句

在执行语句中,和正常的存储过程差不多,不过触发器多了两个存储过程没有的对象,分别是NEWOLD

OLD:代表着更新,删除前的数据,可以通过OLD.字段名来获取以前的值

NEW:代表着新增,更新后的数据,可以通过NEW.字段名来获取以后的值

其中同上描述的,新增类型的触发器没有OLD,删除类型的触发器没有NEW,而更新触发器两者都有

好的,经过语法的介绍,直接进入实战;

2)示例

首先来一张用户表,需求很简单,如果年龄小于12岁时,将报错不允许操作

1
2
3
4
5
6
7
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;

那么,如何使用触发器完成这上面这个功能需求呢?具体触发器如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 ;

创建完成后,我们查看效果
animation

三、最后

虽然触发器有着自己的局限性,但从某一个角度上来说,它确实是一个好东西。

在我经历的这段时间,它可以完成以下这些实用功能

  • 表数据历史的收集,作为一个历史数据保存至其他历史表中。

  • 某些数据通过判断后,来确定一些状态字段的值。

  • 触发检测,是否达到预警,从而发送告警事件

触发器的功能也可以做到许多东西,关键看自己如何去进行使用,搭配代码,事半功倍!

我是半月,祝你幸福!!!