MySQL 触发器

一、触发器

触发器是一种特殊的存储过程,它在特定的数据库活动发生时自动执行。
在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/qq_45124256/article/details/109210299?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3-109210299-blog-5471645.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3-109210299-blog-5471645.pc_relevant_default

https://blog.csdn.net/qq_39158327/article/details/84865422?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-84865422-blog-5471645.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-84865422-blog-5471645.pc_relevant_default

https://blog.csdn.net/Late_whale/article/details/103411805?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2-103411805-blog-5471645.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2-103411805-blog-5471645.pc_relevant_default

 https://blog.csdn.net/A496608119/article/details/123277898

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值