如何访问 MySQL 触发器中的“INSERTED”值?
Posted
技术标签:
【中文标题】如何访问 MySQL 触发器中的“INSERTED”值?【英文标题】:How to access "INSERTED" values in a MySQL trigger? 【发布时间】:2019-03-02 23:24:37 【问题描述】:如何在触发器中访问INSERTED
表的值?
例如:
INSERT INTO sales (sku, qty)
VALUES
(1001, 5), //I need these values in the trigger
(1002, 1)
...
这是我的触发器:
DELIMITER $$
CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET NEW.qty = OLD.qty - INSERTED.qty
WHERE sku = INSERTED.sku;
END;
$$
DELIMITER;
注意sales.sku
是products
表的外键。
SQL Server 有 INSERTED
关键字,这似乎不适用于 mysql。
答案:
NEW.qty
引用了设置了触发器的表上的qty
,不是正在更新的表。
CREATE TRIGGER after_sales_insert
AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET qty = qty - NEW.qty
WHERE sku = NEW.sku;
END;
【问题讨论】:
【参考方案1】:给定:
INSERT INTO sales (sku, qty)
VALUES
(1001, 5), //I need these values in the trigger
(1002, 1)
...
我相信你想要这个:
CREATE TRIGGER after_sales_insert AFTER INSERT ON sales
FOR EACH ROW BEGIN
UPDATE products
SET qty = qty - NEW.qty
WHERE sku = NEW.sku;
END;
参考资料:
MySQL 8: 24.3.1 Trigger Syntax and Examples
How to program a MySQL trigger to insert row into another table?
How does "for each row" work in triggers in mysql?
【讨论】:
是否可以在 mysql 中加入 NEW,就像您可以在 SQL Server 中加入 INSERTED 一样...所以不要一次做一个? 现在一切都说得通了。我以为NEW.qty
引用的是产品表而不是销售表。谢谢!以上是关于如何访问 MySQL 触发器中的“INSERTED”值?的主要内容,如果未能解决你的问题,请参考以下文章
无法在另一个 foreach mysql C# 中的 foreach 循环中获取 Last_inserted_id