【问题标题】:MySQL - Can't update table in stored function/trigger because it is already used by statement which invoked this stored function/trigger (select)MySQL - 无法更新存储函数/触发器中的表,因为它已被调用此存储函数/触发器(选择)的语句使用
【发布时间】:2022-11-17 19:13:02
【问题描述】:

我是 MySQL 的新手,正在学习触发器。我有 2 个我想要的表:当插入一个表(detail_transaction)时,另一个表(项目)的“库存”字段发生变化。

  • '项目'表
id name price stock
1 Item_A 15 900
2 Item_B 9 500
  • 'detail_transaction' 表
id id_item count total_price
1 1 5 75

如果我在“detail_transaction”表中插入新行,我希望“item”表中具有相同“id”的“stock”字段减少并调整为“detail_transaction”的“count”。例如 : 我在“detail_transaction”表中插入新行:

id id_item count total_price
2 1 10 150

我想将“项目”表更新为:

id name price stock
1 Item_A 15 890
2 Item_B 9 500

我创建了一个触发器来尝试实现我的目的,但是当我尝试在“detail_transaction”中插入新行时,出现了这个错误:无法更新存储函数/触发器中的“项目”表,因为它已被调用此存储函数/触发器的语句使用.

我的触发器:

DELIMITER $$
CREATE TRIGGER update_stock
AFTER INSERT
    ON detail_transaction 
    FOR EACH ROW
BEGIN
    UPDATE item
    JOIN detail_transaction ON detail_transaction.id_item = item.id
    SET stock = stock - NEW.count
    WHERE item.id = NEW.id_item;
END$$
DELIMITER ;

然后,我将行插入 detail_transaction 表:

INSERT INTO detail_transaction (id, id_item, count, total_price)
VALUES (2, 1, 10, (SELECT price FROM item WHERE item.ID = 1) * 10);

但是我得到了错误。我能做些什么来解决这个问题?是因为我尝试插入时的 SELECT 部分吗?感谢您的回答。

【问题讨论】:

    标签: mysql triggers


    【解决方案1】:

    首先(和自以为是):触发器是真的难以调试、测试和维护。他们引入了副作用——“我在这张桌子上做了 X,然后 Y 发生在另一张桌子上”。

    触发器的挑战之一是数据库引擎不希望发生无限循环。而且解析器不够智能,无法确保这种情况不会在您的查询中发生——您要在触发器内加入要在其上创建触发器的表。解析器担心您可能正在更改定义触发器的表,触发器,这将导致无限循环。

    此外,您不需要该连接 - 您可以从 NEW 中获取值。如果您删除连接,它应该可以工作。

    DELIMITER $$
    CREATE TRIGGER update_stock
    AFTER INSERT
        ON detail_transaction 
        FOR EACH ROW
    BEGIN
        UPDATE item
        SET stock = stock - NEW.count
        WHERE item.id = NEW.id_item;
    END$$
    DELIMITER ;
    

    【讨论】:

    • 触发器真的很难调试..我在调试触发器时从未遇到过问题。所有需要的信息(调试点编号、列和变量值)都应该保存到特殊的调试表中。
    猜你喜欢
    • 2019-05-20
    • 2015-11-03
    • 2017-05-23
    • 2019-08-05
    • 2013-02-24
    • 2015-02-13
    • 1970-01-01
    • 2023-01-19
    • 2021-07-09
    相关资源
    最近更新 更多