mysql insert after触发器使所有insert查询失败

7ajki6be  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(536)

这个问题在这里已经有答案了

mysql-插入后更新相同表的触发器(6个答案)
9个月前关门了。
我有以下表格结构:

这个触发器:

DELIMITER |

CREATE TRIGGER `credits__after_insert` AFTER INSERT ON `credits`
    FOR EACH ROW BEGIN

        UPDATE `clients`
            SET `clients`.`available_credits` =
                (SELECT SUM(`amount`) FROM `credits`
                    WHERE `client_id` = NEW.client_id )
            WHERE `clients`.`id` = NEW.client_id;

        UPDATE `credits`
            SET NEW.`remaining` =
                (SELECT SUM(`amount`) FROM `credits`
                    WHERE `client_id` = NEW.client_id );

    END;
|
DELIMITER ;

每次尝试插入新行时,都会收到以下错误:


# 1442 - Can't update table 'credits' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

我不明白为什么它会给我这个错误。我也不想收到类似的问题/答案,因为在过去的两个小时里,我已经试过了。我想要一个简单易懂的解释,如果可能的话还有一个解决办法。
谢谢。

rqmkfv5c

rqmkfv5c1#

不能更新同一个表。
但是你应该有一张单独的table
信用值(信用id, available_credits , remaining )更新这个。
当你需要信息的时候,你只需要加入表格
只能用总和更新插入的当前行

DELIMITER |

CREATE TRIGGER `credits__after_insert` AFTER INSERT ON `credits`
    FOR EACH ROW 
    BEGIN

        SET NEW.`available_credits` = (SELECT SUM(`amount`) FROM `credits` WHERE `client_id` = NEW.client_id );

        SET NEW.`remaining` = (SELECT SUM(`amount`) FROM `credits` WHERE `client_id` = NEW.client_id );

    END;
|
DELIMITER ;

或者像akina指出的没有分隔符的单一命令

CREATE TRIGGER `credits__after_insert` AFTER INSERT ON `credits`
    FOR EACH ROW      
        SET NEW.`available_credits` = (SELECT SUM(`amount`) FROM `credits` WHERE `client_id` = NEW.client_id ),            
              NEW.`remaining` = (SELECT SUM(`amount`) FROM `credits` WHERE `client_id` = NEW.client_id);
wrrgggsh

wrrgggsh2#

你尝试更新 credits 扣动扳机。但是,触发器是在 credits . 因此 credits 在触发器内部会导致触发器一次又一次地开火。
这就是mysql禁止这种星座的原因。
我想你需要重写这本书 UPDATEcredits 在触发器内部直接修改新条目。

相关问题