【发布时间】:2021-10-27 00:18:03
【问题描述】:
我需要创建一个更新前触发器以在新产品价格变为“有效”后更改“旧”产品价格的状态
价目表:
id product_id supplier list_price_uom start_date price_status
1 101761 ABC 16.26 2021-02-01 Active
2 101761 DEF 19.5 2021-07-01 Active
3 1086 ABC 32.52 2021-02-01 Active
4 1087 ABC 32.52 2021-02-01 Active
5 AWBWHL ABC 82.23 2021-02-01 Active
6 101761 ABC 19.26 2021-08-30 Scheduled
7 1086 ABC 37.52 2021-08-30 Scheduled
8 1087 ABC 34.52 2021-08-30 Scheduled
9 AWBWHL ABC 85.23 2021-08-30 Scheduled
当 start_date = curdate() 时,我有一个将状态更新为“活动”的事件
CREATE EVENT "change_status"
ON SCHEDULE EVERY 1 DAY STARTS
'2021-08-26 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO UPDATE
price_list_test SET status = 'Active' WHERE status = 'Scheduled'
AND start_date = curdate()
当同一 SKU(来自同一供应商)被事件更新时,我需要将所有“活动”行更改为“非活动”。
我尝试了不同的变体:
BEFORE UPDATE ON "price_list_test" FOR EACH ROW
BEGIN IF (new.product_id = old.product_id) and (new.supplier = old.supplier) and (old.start_date < CURDATE()) THEN SET old.price_status = 'Inactive';
end if ;
END
这给了我错误“触发器中不允许更新旧行:
删除“旧”会给我错误“未知系统变量'price_status'”
试过这个:
BEFORE UPDATE ON "price_list_test" FOR EACH ROW BEGIN
UPDATE price_list_test SET price_status = 'Inactive' where new.product_id = old.product_id and old.start_date < CURDATE()
;
这给了我这个错误 “错误代码:1442。无法更新存储函数/触发器中的表 'price_list_test',因为它已被调用此存储函数/触发器的语句使用。”
这是有道理的,只是没有想法。 任何帮助将不胜感激。
【问题讨论】:
-
触发器不能更新同一个表。您需要将此逻辑移到应用程序中。
标签: mysql mysql-workbench mysql-8.0