mysql - 插入触发器后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。请问有什么明显的地方我做错了吗?
非常感谢您的关注。
解决方案
那是因为您的联接返回了 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 条记录吗?并用售价更新每条记录?无论如何,我把它留给你..
推荐阅读
- neo4j - Neo4j - 图形数据科学库 - 如何对图形目录中的命名图形进行密码查询?
- sql - 获取从日期字段到固定日期的天数
- c++ - 从多线程写入时丢失了一些日志
- python - 具有不同大小的多个数据帧的数学运算
- scala - Scala过滤掉任何column2与column1匹配的行
- list - 如何在 Clojure 中过滤向量列表?
- coding-style - 请求有关代码风格/最佳实践的输入
- python-3.x - Python & SQLite:遍历行只选择第一行
- php - 如何让 PHP 包含数据 URI(不打开 allow_url_include)?
- python-3.x - 测试 spark 数据框列是否包含 5 位数字