插入触发器后mysql更新

uyto3xhc  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(379)

我对触发器还不熟悉,但已经编写了这个触发器

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。请问有什么明显的错误是我做错的吗?
非常感谢您的光临。

ecr0jaav

ecr0jaav1#

这是因为join返回了orderdeails和orders表中的所有或大部分记录,而您并没有抑制它们 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 已经包含了这些为您和如果你有许多数量为一个单一的股票?i、 e 100台戴尔笔记本电脑。你的库存中没有每台戴尔笔记本电脑100条记录吗?并用售价更新每个记录?不管怎样,我让你来决定。。

相关问题