MySQL触发器
触发器的特性
- 需要MySQL 5
对触发器的支持是在MySQL 5中增加的 - 仅支持表
只有表才支持触发器,视图不支持(临时表也不支持)。 - 保持每个数据库的触发器名唯一
在MySQL 5中,触发器名必须在每个表中唯一,但不是在每个数据库中唯一。这表示同一数据库中的两个表可具有相同名字的触发器。这在其他每个数据库触发器名必须唯一的DBMS中是不允许的,而且以后的MySQL版本很可能会使命名规则更为严格。因此,现在最好是在数据库范围内使用唯一的触发器名。 - 触发器失败
如果BEFORE触发器失败,则MySQL将不执行请求的操作。此外,如果BEFORE触发器或语句本身失败,MySQL将不执行AFTER触发器(如果有的的话) - BEFORE或AFTER
通常,将BEFORE用于数据验证和净化(目的是保证插入表中的数据确实是需要的数据)
触发器的应用场景
需要在某个表发生更改时自动处理。
例如:
- 每当增加一个顾客到某个数据库表时,都检查其电话号码格式是否正确,州的缩写是否为大写;
- 每当订购一个产品时,都从库存数量中减去订购的数量;
- 无论何时删除一行,都在某个存档表中保留一个副本。
触发器是MySQL响应以下任意语句而
自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语
句):
DELETE;
INSERT;
UPDATE。
查看触发器
- 图形化工具(MySQL workBench)
- 终端
show triggers
删除触发器
DROP TRIGGER [trigger_name]
触发器不能更新或覆盖。为了修改一个触发器,必须先删除它,然后再重新创建。
创建触发器
在创建触发器时,需要给出4条信息:
唯一的触发器名;
触发器关联的表;
触发器应该响应的活动(DELETE、INSERT或UPDATE);
触发器何时执行(处理之前或之后)。
通过出发条件和响应活动组合每张表最多可以创建6个触发器
- 创建触发器的语法如下
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包含的多条语句
- 创建有多个执行语句的触发器
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
执行语句列表
END
其中,BEGIN与END之间的执行语句列表参数表示需要执行的多个语句,不同语句用分号隔开
- NEW和OLD的使用:
示例
- 用户user表
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
`add_time` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`(250)) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=latin1;
- 日志logs表
CREATE TABLE `logs` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`log` varchar(255) DEFAULT NULL COMMENT '日志说明',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日志表';
- 触发器
CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW
BEGIN
DECLARE s1 VARCHAR(40)character set utf8;
DECLARE s2 VARCHAR(20) character set utf8;#后面发现中文字符编码出现乱码,这里设置字符集
SET s2 = " is created";
SET s1 = CONCAT(NEW.name,s2); #函数CONCAT可以将字符串连接
INSERT INTO logs(log) values(s1);
END;
效果演示
关于触发器的进一步介绍
- 与其他DBMS相比,MySQL 5中支持的触发器相当初级。未来的MySQL版本中有一些改进和增强触发器支持的计划。
- 创建触发器可能需要特殊的安全访问权限,但是,触发器的执行是自动的。如果INSERT、UPDATE或DELETE语句能够执行,则相关的触发器也能执行.
- 应该用触发器来保证数据的一致性(大小写、格式等)。在触发器中执行这种类型的处理的优点是它总是进行这种处理,而且是透明地进行,与客户机应用无关。
- 触发器的一种非常有意义的使用是创建审计跟踪。使用触发器,把更改(如果需要,甚至还有之前和之后的状态)记录到另一个表非常容易
- MySQL触发器中不支持CALL语句。这表示不能从触发器内调用存储过程。所需的存储过程代码需要复制到触发器内
- 业务代码VS触发器?相对来说业务代码更加容易维护,而触发器速度更快.
参考博客:https://www.cnblogs.com/phpper/p/7587031.html
参考书籍:<<MySQL必知必会>>