我们知道,MySQL 触发器一直以来在功能和性能上都没有做任何更新,直到MySQL 5.7的发布。 虽然新版本只是在功能上做了相关更新,但是也足以让大家有小小的兴奋。现在来说说他主要的更新点。
在MySQL 5.6.x 之前,MySQL 一张表只能有六个触发器,分别为before/after这两个动作,针对insert/update/delete 这三种操作。
那么如果想在一张表上同一个动作并且同一种操作上做一系列的数据库业务处理,就必须把这些业务放在一个事务块里面,写一个非常大的触发器。这会使后期维护极其费劲。
在MySQL 5.7中,可以对一张表上的同一个动作并且是同一个操作定义多个不同的触发器。例如,我们可以对T1这张表定义两个”BEFORE UPDATE”触发器,默认的,当对T1做UPDATE前,这两个”BEFORE UPDATE"触发器会按照创建的顺序依次被触发。同时我们可以通过"trigger_order"语句指定FOLLOW或PRECEDES,即一个触发器“跟随”在另一个之后触发,或一个触发器“提前”另一个触发。
对触发器做这样的顺序拆分,虽然在性能上没啥大的区分,但是每个触发器功能上相对简单了许多,对后期维护就简单多了。
现在我们来举个例子,由于MySQL直到目前最新版也没有“角色“这个功能,如果我们想记录一堆用户的更新日志,只能把所有逻辑写到一个触发器里面逐个条件来判断,在5.6中,就只能写一个大的触发器来对用户操作记录日志,在这个触发器里面判断操作用户的角色,并写不同的日志表。
从MySQL5.7 开始就可以每个用户一个触发器来做,这样代码简单明了,可读性也很强,虽然可能会有些许冗余代码。
示例基础表结构:
CREATE TABLE t1 (
id INT ,rank INT, nickname VARCHAR(64)
) ENGINE INNODB;
ALTER TABLE t1 ADD PRIMARY KEY (id), ADD KEY idx_rank (rank));
用户记录日志表(管理员):
CREATE TABLE t1_log_admin (
id INT(11) NOT NULL, rank INT(11) DEFAULT NULL,
nickname VARCHAR(64) DEFAULT NULL,
update_time DATETIME DEFAULT NULL,
update_user VARCHAR(64) DEFAULT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8;
用户记录日志表(普通人员):
CREATE TABLE t1_log_normal