为什么我插入的时候显示Can't update table 'mytable' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
时间: 2024-03-22 16:41:01 浏览: 47
Can’t open file:'[Table]mytable.MYI’
这个错误提示是因为 MySQL 触发器在执行时会锁定表,导致无法在触发器中对该表进行更新操作。
根据你的描述,可能是你在触发器中对 `mytable` 表进行了更新操作,而该表已经被插入数据的 SQL 语句使用了,从而导致了这个错误。
为了避免这个问题,你可以考虑使用 `BEFORE INSERT` 触发器,将要插入的数据作为触发器参数传递给触发器,然后在触发器中计算其他两个列的值,把计算结果赋给这两个列。这样可以避免在触发器中对表进行更新操作,从而避免了表被锁定的问题。
以下是一个示例代码,用于实现 `a=b+c`、`b=a-c` 和 `c=a-b` 的逻辑:
```
CREATE TRIGGER update_abc BEFORE INSERT ON mytable
FOR EACH ROW
BEGIN
DECLARE a_val INT;
DECLARE b_val INT;
DECLARE c_val INT;
SET a_val = NEW.a;
SET b_val = NEW.b;
SET c_val = NEW.c;
IF a_val IS NULL THEN
SET a_val = b_val + c_val;
END IF;
IF b_val IS NULL THEN
SET b_val = a_val - c_val;
END IF;
IF c_val IS NULL THEN
SET c_val = a_val - b_val;
END IF;
SET NEW.a = a_val;
SET NEW.b = b_val;
SET NEW.c = c_val;
END;
```
这个触发器会在插入数据前执行,将要插入的数据作为 `NEW` 对象传递给触发器。触发器中会先将 `NEW.a`、`NEW.b` 和 `NEW.c` 的值保存到变量中,然后根据需要计算出其他两个列的值,并将计算结果赋给这两个列。
这样,无论是在插入数据时还是在触发器中计算值时,都没有对表进行更新操作,就可以避免表被锁定的问题。
阅读全文