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必知必会>>

posted on 2019-09-04 08:50  叫我胖虎大人  阅读(1237)  评论(0编辑  收藏  举报