MySQL触发器

发布时间 2023-11-22 13:47:51作者: 小林当

触发器

1. 触发器概述

  • MySql 从 5.0.2 版本开始支持触发器。MySql 的触发器和存储过程一样,都是嵌入到MySql服务器的一段程序。
  • 触发器是由事件来触发某个操作,这些事件包括insert,update,delete事件。所谓事件就是指用户的动作或者触发某项行为。如果定义了触发程序,当数据库执行这些语句时候,就相当于事件发生了,就会自动激发触发器执行相应的操作
  • 当对数据表中的数据执行插入,更新和删除操作,需要自动执行一些数据库逻辑时,可以使用触发器来实现。

2. 触发器的创建

2.1 创建触发器语法

创建触发器的语法结构:

create trigger 触发器名称
{before|after} {insert|update|delete} on 表名
for each row
# 触发体 触发器执行的语句块
....

例如

delimiter //
CREATE TRIGGER xld_insert_trigger
BEFORE INSERT ON xld	
FOR EACH ROW
BEGIN
INSERT INTO xld_log(log) VALUES ('xld.insert.before.log');
END //
delimiter ;

说明:

表名:表示触发器监控的对象。

before|after:表示触发器的时间,before 表示在事件之前触发after 表示在事件之后触发

insert|update|delete:表示触发的事件。

​ 1. insert 表示插入记录时触发

​ 2. update 表示更新记录时触发

​ 3. delete 表示删除记录时触发

触发器执行的语句块:可以在单条SQL语句,也可以是由 begin...end 结构组成的复合语句块。

2.2 old 和 new

触发器针对的是数据表中的每条记录(每行),每行在数据操作前后都有一个对应的状态,触发器在执行之前就将对应的状态获取到了,将没有操作之前的状态(数据)都保存到old关键字中(旧的数据),而操作后的状态都放到new中(新的数据)

  • old:表示将要被删除或者修改原数据
old.字段名称
# 例如
old.xld_name
  • new:表示将要被插入或者修改新数据
new.字段名称
# 例如
new.xld_name

注意:old 是只读的,而 new 则可以在触发器中使用 SET 再次赋值,这样不会再次触发触发器,造成循环调用。

注意:old 和 new 并不是所有触发器都有

  • insert:数据插入前后,都没有old
  • delete:清空数据,没有new
  • update:修改数据,即有 old 也有 new

3. 查看,删除触发器

3.1 查看触发器

查看触发器是查看数据库中已经存在的触发器的定义,状态和语法信息。

  • 方式1:查看当前数据库的所有触发器的定义
show triggers;
# 例如
SHOW TRIGGERS
  • 方式2:查看当前数据库某个触发器的定义
show create trigger 触发器名称;
# 例如
SHOW CREATE TRIGGER xld_insert_trigger;
  • 方式3:从系统库information_schema 的 TRIGGERS 表中查询触发器的信息。
SELECT * FROM information_schema.`TRIGGERS`

3.2 删除触发器

触发器也是数据库对象,删除触发器也用 drop 语句。格式如下:

drop trigger if exists 触发器名称;
# 例如
DROP TRIGGER IF EXISTS xld_insert_trigger;

4. 触发器的优缺点

4.1 优点

  • 触发器可以确保数据的完整性(保证存在关联的两张或多张表的数据完整性)
  • 触发器可以帮助我们记录操作的日志
  • 触发器还可以用在操作数据前,对数据进行合法性检查

4.2 缺点

  • 触发器最大一个问题就是可读性差
  • 相关数据的变更,可能会导致触发器报错

4.3 注意点

注意。如果在字表中定义外键约束,并且外键指定了 鸥鸟update/delete cascade/set null 子句,此时修改父表被引用的键值或删除父表被引用的记录行时,也会引起子表的修改和删除操作,此时基于子表的update和delete语句定义的触发器并不会被触发。

总结一句话:就是表中的外键字段由于约束导致的 修改或删除 是无法触发触发器的执行的

MySql数据库自定义错误

语法结构:

signal sqlstate 'HY000' set message_text = '错误描述';

例如

SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '小林当的第一个错误!!!';

注意:sqlstate 应该必须为  ’HY000‘  的吧!不然会报错 [Err] 1407 - Bad SQLSTATE: 'HY000000'