然后触发:
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的所有功能。我想要一个简单易懂的解释,并在可能的情况下寻求解决方案。
谢谢。
答案 0 :(得分:1)
您尝试在触发器中更新credits
。但是,您的触发器是在credits
上定义的。因此,触发器内部credits
上的更新将导致触发器再次触发-一次又一次,一次又一次。
这就是为什么MySQL禁止这样的星座。
我认为您需要在触发器内重写UPDATE
的{{1}},以直接修改新条目。
答案 1 :(得分:1)
但是您应该使用一个单独的表
credit_values(credit_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指出的那样,是没有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);