首页 > 解决方案 > 插入触发器后MySQL更新

问题描述

我是触发器的新手,但已经编写了这个

DELIMITER $$

CREATE TRIGGER stockupdate
AFTER INSERT ON inventory.orderdetails
FOR EACH ROW

BEGIN

    UPDATE inventory.stockitem s
    INNER JOIN inventory.OrderDetails d ON s.ID = d.Item
    INNER JOIN inventory.orders o ON ebayOrderNumber = d.OrderNumber
    SET s.`Sold Date` = o.`Order Date`, s.EbayOrderNumber = o.ebayOrderNumber, s.`Sale Price` = d.Price
    WHERE s.ID = d.Item;

END$$

DELIMITER ;

目前它没有按预期更新表 stockitem。请问有什么明显的地方我做错了吗?

非常感谢您的关注。

标签: mysqltriggers

解决方案


那是因为您的联接返回了 oderDetails 和 oders 表中的所有或大部分记录,并且您没有抑制sql_safe_updates安全功能。

您肯定缺少o ON ??.ebayOrderNumber = d.OrderNumber. 此外,WHERE s.ID = d.Item;这是多余的,因为您的表连接已经这样做了。您的 Where 条件应该更加明确,并告诉您要更新哪个库存项目。

DELIMITER $$

CREATE TRIGGER stockupdate    AFTER INSERT ON inventory.orderdetails    FOR EACH ROW
BEGIN

        UPDATE 
            (inventory.stockitem s
            INNER JOIN inventory.OrderDetails d ON s.ID = d.Item)
            INNER JOIN inventory.orders o       ON o.ebayOrderNumber = d.OrderNumber
        SET 
            s.`Sold Date`     = o.`Order Date`,  -- update the stock
            s.EbayOrderNumber = o.ebayOrderNumber,
            s.`Sale Price`    = d.Price
        WHERE
            d.orederNumber    = NEW.OrderNumber, -- From this order
            d.Item            = NEW.item; -- and this item id

END$$

DELIMITER ;

话虽如此,我不明白您为什么要使用售价更新库存表?orderDetails已经包含了那些给你的,如果你有很多数量的单一库存怎么办?即 100 台戴尔笔记本电脑。您的库存商品中的每台戴尔笔记本电脑肯定没有 100 条记录吗?并用售价更新每条记录?无论如何,我把它留给你..


推荐阅读