【问题标题】:MYSQL Update Trigger - Can't update table in stored function/trigger because it is already used by statementMYSQL 更新触发器 - 无法更新存储函数/触发器中的表,因为它已被语句使用
【发布时间】: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.

检查了一些 StackOverflow 的答案,并尝试在没有 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

【问题讨论】:

    标签: mysql sql triggers


    【解决方案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总是定义为这种差异,您应该使用生成的列。这样,您不必更新值。当你查询表时它是正确的。

    【讨论】:

      猜你喜欢
      • 2019-05-20
      • 2015-11-03
      • 2013-02-24
      • 2022-11-17
      • 2017-05-23
      • 2019-08-05
      • 2021-02-20
      • 2015-02-13
      • 2023-01-19
      相关资源
      最近更新 更多