一、触发器
触发器是一种特殊的存储过程,它在特定的数据库活动发生时自动执行。
在MySQL中,只有执行insert,delete,update操作时才能触发触发器的执行。
用途:可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作
二、管理触发器
1、创建触发器
-- 格式一:创建只有一个执行语句的触发器
CREATE TRIGGER 触发器名称 触发时机(BEFORE|AFTER) 触发动作(DELETE|UPDATE|INSERT)
ON 表名 FOR EACH ROW
触发后执行的SQL语句;
-- 格式二:创建有多个执行语句的触发器
delimiter $$
CREATE TRIGGER 触发器名称 触发时机(BEFORE|AFTER) 触发动作(DELETE|UPDATE|INSERT)
ON 表名 FOR EACH ROW
BEGIN
触发后执行的SQL语句;
END $$;
delimiter;
示例:当Customers表添加一行数据,则会自动在Customers的cust_address列添加'SN Company'
接下来表演踩坑时刻!!
1.1、踩坑First one
-- 需求1:当Customers表添加一行数据,则会自动在Customers的cust_address列添加'SN Company'
CREATE TRIGGER trigger01 AFTER INSERT
ON Customers FOR EACH ROW
UPDATE Customers SET cust_address = 'SN Company' WHERE cust_id = NEW.cust_id;
-- 在Customers表添加数据,让触发器自动执行
INSERT INTO Customers(cust_id, cust_name, cust_address) VALUES('1000000006', 'Tom', 'NJ');
-- 报错:“1442 - Can't update table 'customers' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.”
【发生源头】想要在插入或者更新数据之后修改数据
【错误原因】MySQL在使用触发器时,执行操作的对象 与 拥有该触发器的表不能为同一张表,否则触发器会不停地进行递归调用。所以 MySQL 在 触发器 触发insert和update的时候不让执行insert和update操作
【解决方案】直接SET设置取值,SO。。遇到第二坑/(ㄒoㄒ)/~~
1.2、踩坑Second one
-- 需求1:当Customers表添加一行数据,则会自动在Customers的cust_address列添加'SN Company'
CREATE TRIGGER trigger01 AFTER INSERT
ON Customers FOR EACH ROW
SET New.cust_address = 'SN Company';
-- 报错:“1362 - Updating of NEW row is not allowed in after trigger”
【发生源头】想要在插入或者更新数据之后修改数据,PS:结果直接创建触发器就给我报警了。。
【错误原因】注意触发器涉及触发表自身的操作时,用before
【解决方案】修改触发器触发动作为BEFORE
1.3、Successful
-- 需求1:当Customers表添加一行数据,则会自动在Customers的cust_address列添加'SN Company'
CREATE TRIGGER trigger01 BEFORE INSERT
ON Customers FOR EACH ROW
SET New.cust_address = 'SN Company';
-- 在Customers表添加数据,让触发器自动执行
INSERT INTO Customers(cust_id, cust_name, cust_address) VALUES('1000000006', 'Tom', 'NJ');
触发前Customers表数据
触发后Customers表数据
2、查看触发器
-- 查看指定触发器
SHOW CREATE TRIGGER 触发器名称;
-- 查看所有触发器
SHOW TRIGGERS;
3、删除触发器
DROP TRIGGER 触发器名称;
参考学习链接:
https://blog.csdn.net/A496608119/article/details/123277898