MYSQL 更新触发器 - 无法更新存储函数/触发器中的表,因为它已被语句使用
Posted
技术标签:
【中文标题】MYSQL 更新触发器 - 无法更新存储函数/触发器中的表,因为它已被语句使用【英文标题】:MYSQL Update Trigger - Can't update table in stored function/trigger because it is already used by statement 【发布时间】:2021-07-09 06:59:18 【问题描述】:我有一个名为 Client 的表,我想在更新 balance 字段后更新可用的 credit 列。
我创建了这个触发器
DELIMITER $$
CREATE TRIGGER client_update_balance
AFTER UPDATE ON client
FOR EACH ROW
BEGIN
update client
set AvailableCredit = CreditLimit - new.Balance;
END
但是当我更新这样的余额值时
SET SQL_SAFE_UPDATES = 0;
UPDATE client
SET
balance = 1500
WHERE
client.ClientNum = 143;
我收到此错误:
Error Code: 1442. Can't update table 'client' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
检查了一些 *** 的答案,并尝试在没有 Update 语句的情况下
DELIMITER $$
CREATE TRIGGER client_update_balance
AFTER UPDATE ON client
FOR EACH ROW
BEGIN
set New.AvailableCredit = New.CreditLimit - New.Balance;
END;$$
DELIMITER ;
我得到另一个错误
Error Code: 1362. Updating of NEW row is not allowed in after trigger
【问题讨论】:
【参考方案1】:使用before update
触发器并设置值:
DELIMITER $$
CREATE TRIGGER client_update_balance
BEFORE UPDATE ON client
FOR EACH ROW
BEGIN
set new.AvailableCredit = new.CreditLimit - new.Balance;
END;
这个想法是您想要更改正在更新的表的同一行中的值。您不需要单独的update
事务来执行此操作。您只需要调整值。
也就是说,如果AvailableCredit
总是定义为这种差异,您应该使用生成的列。这样,您不必更新值。当你查询表时它是正确的。
【讨论】:
以上是关于MYSQL 更新触发器 - 无法更新存储函数/触发器中的表,因为它已被语句使用的主要内容,如果未能解决你的问题,请参考以下文章
如何解决错误 1442:无法更新 mysql 中存储的函数/触发器中的表 'tb_name'?
无法更新存储函数/触发器中的表“事务”,因为它已被调用此存储函数/触发器的语句使用