触发器后mysql插入使所有插入查询失败

时间:2020-08-05 21:05:11

标签: mysql sql mariadb

我具有以下表格结构: enter image description here

然后触发:

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.

我不明白为什么它会给我这个错误。我也不想收到类似的问题/答案,因为我在过去两个小时内尝试了SO的所有功能。我想要一个简单易懂的解释,并在可能的情况下寻求解决方案。

谢谢。

2 个答案:

答案 0 :(得分:1)

您尝试在触发器中更新credits。但是,您的触发器是在credits上定义的。因此,触发器内部credits上的更新将导致触发器再次触发-一次又一次,一次又一次。

这就是为什么MySQL禁止这样的星座。

我认为您需要在触发器内重写UPDATE的{​​{1}},以直接修改新条目。

答案 1 :(得分:1)

您不能update the same table

但是您应该使用一个单独的表

credit_values(credit_id,available_creditsremaining)并进行更新。

当您需要信息时,只需加入表即可

您只能使用总和来更新要插入的当前行

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指出的那样,是没有DELIMITER的单个命令

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);