You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL触发器实现新价目激活时自动将同SKU同供应商旧价目设为无效咨询

解决方案

报错原因说明

  • 报错updating OLD row is not allowed in trigger:触发器中OLD代表行更新前的只读记录,不可修改,如需调整当前触发行的字段值,只能修改NEW对应的属性。
  • 报错Error Code: 1442:MySQL 禁止在表的触发器/存储函数中对触发该逻辑的同一张表执行增删改操作,避免出现递归调用、数据死锁等异常。

最优实现方案(无需触发器)

直接修改原有定时事件的执行逻辑,在同一个定时任务中完成「旧价目失效+新价目激活」两个动作,绕开触发器的使用限制,逻辑更清晰易维护:

DELIMITER //
CREATE EVENT `change_status` 
ON SCHEDULE EVERY 1 DAY 
STARTS '2021-08-26 00:00:00' 
ON COMPLETION NOT PRESERVE ENABLE 
DO 
BEGIN
    -- 第一步:将当天需要激活的价目对应同product_id、同supplier的旧Active价目置为Inactive
    UPDATE price_list_test p1
    INNER JOIN price_list_test p2 
        ON p1.product_id = p2.product_id 
        AND p1.supplier = p2.supplier
    SET p1.price_status = 'Inactive'
    WHERE p1.price_status = 'Active'
      AND p2.price_status = 'Scheduled'
      AND p2.start_date = CURDATE();
    
    -- 第二步:激活当天到期的计划价目
    UPDATE price_list_test 
    SET price_status = 'Active' 
    WHERE price_status = 'Scheduled' 
      AND start_date = CURDATE();
END //
DELIMITER ;

注意事项

原有事件代码中状态字段名写错了,表结构的状态字段为price_status,但原来写的是status,上述代码已经修正了该问题。如果确实需要用触发器实现,可以将状态更新逻辑封装到存储过程中由事件调用,本质和上述方案逻辑一致,不建议强行使用触发器增加复杂度。

内容的提问来源于stack exchange,提问作者Eric

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:54:05