如何访问 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.skuproducts 表的外键。

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”值?的主要内容,如果未能解决你的问题,请参考以下文章

触发器中的inserted表和deleted表

sql插入的操作

SQL触发器中的inserted表和deleted表

无法在另一个 foreach mysql C# 中的 foreach 循环中获取 Last_inserted_id

为啥 INSTEAD OF UPDATE 触发器的 INSERTED 表为空?

数据库触发器inserted和deleted详解