【问题标题】:MySQL trigger to change products price status to inactive after a new price list become activeMySQL 触发器在新的价目表变为活动状态后将产品价格状态更改为非活动状态
【发布时间】: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


【解决方案1】:

在事件过程中执行一切

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 t1
LEFT JOIN price_list_test t2 ON t1.SKU = t2.SKU /* replace with correct condition */
                            AND t2.status = 'Active'
SET t1.status = 'Active',
    t2.status = 'Inactive'
WHERE t1.status = 'Scheduled' 
  AND start_date = CURRENT_DATE;

在这种情况下不需要额外的操作/代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    相关资源
    最近更新 更多