MySql触发器对同表更新

本文深入探讨了SQL触发器在更新表中特定字段值时的应用,通过实例展示了如何在数据库操作中实现动态更新。特别关注了在遇到更新冲突时的解决方案,以及前后触发器关键字(BEFORE与AFTER)的区别与应用。同时,介绍了触发器语法和常见错误处理策略,帮助开发者更高效地管理数据库状态。

触发器初始结构:

DELIMITER $$
CREATE
    TRIGGER `数据库名`.`触发器名` BEFORE/AFTER INSERT/UPDATE/DELETE
    ON `数据库名`.`表名`
    FOR EACH ROW BEGIN
     -- 逻辑、条件语句
    END$$

DELIMITER ;

目的:当一张表中的某个字段值更新为特定值时,触发更新本条数据的另一字段值

(示例:根据prj_base_info表中的project_status的值判断是否是600时,触发更新同表的complete_time字段的时间为系统当前时间)

1、开始写出的触发器如下所示

DROP TRIGGER IF EXISTS update_complete_time;
DELIMITER $
CREATE TRIGGER update_complete_time AFTER UPDATE 
ON prj_base_info FOR EACH ROW
BEGIN
    IF (new.project_status=600)
       THEN
    UPDATE prj_base_info 
    SET complete_time =DATE_FORMAT(NOW(), '%Y-%m-%d')
        WHERE prj_base_info.id = new.id;
 END IF;
END $

执行结果没有问题,创建触发器成功,但是执行update语句进行测试如下报错,提示:无法更新存储函数/触发器中的表'prj_base_info',因为它已经被调用此存储函数/触发器的语句使用。

1 queries executed, 0 success, 1 errors, 0 warnings

查询:update prj_base_info set type=2,project_status=600 where id='1537842899333'

错误代码: 1442
Can't update table 'prj_base_info' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

通过查阅资料了解,同表的更新不能在触发器里使用 update,而是直接使用set

修改为:

DROP TRIGGER IF EXISTS update_complete_time;
DELIMITER $
CREATE TRIGGER update_complete_time AFTER UPDATE 
ON prj_base_info FOR EACH ROW
BEGIN
    IF (new.project_status=600)
       THEN
    SET new.complete_time =DATE_FORMAT(NOW(), '%Y-%m-%d')
     ;
 END IF;
END $

结果发现还报错。。。

错误代码: 1362
Updating of NEW row is not allowed in after trigger

AFTER修改为BEFORE即可:

DROP TRIGGER IF EXISTS update_complete_time;
DELIMITER $
CREATE TRIGGER update_complete_time BEFORE UPDATE 
ON prj_base_info FOR EACH ROW
 BEGIN
    IF (new.project_status=600)
     THEN
    SET new.complete_time =DATE_FORMAT(NOW(), '%Y-%m-%d')
    ;
 END IF;
END $

BEFOREAFTER区别:
BEFORE:(insert、update)可以对new进行修改,AFTER不能对new进行修改,两者都不能修改old数据。
对于INSERT语句, 只有NEW是合法的;
对于DELETE语句,只有OLD才合法;
对于UPDATE语句,NEW、OLD可以同时使用。

总结:BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。

 

微信扫描下方二维码(新开通的个人微信公众号)  更多优质资源及面试文章及时获取 请大家多多支持哦

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值