MYSQL 更新触发器 - 无法更新存储的 function/trigger 中的 table,因为它已被语句使用
MYSQL Update Trigger - Can't update table in stored function/trigger because it is already used by statement
我有一个 table 名为 Client ,我想在更新余额字段后更新可用信用栏。
我创建了这个触发器
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.
检查了一些 Whosebug 的答案并尝试在里面没有更新语句
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
使用 before update
触发器并设置值:
DELIMITER $$
CREATE TRIGGER client_update_balance
BEFORE UPDATE ON client
FOR EACH ROW
BEGIN
set new.AvailableCredit = new.CreditLimit - new.Balance;
END;
想法是您想要更改正在更新的 table 同一行中的值。您不需要单独的 update
事务来执行此操作。您只需要调整数值即可。
也就是说,如果 AvailableCredit
总是 定义为这种差异,您应该使用生成的列。这样,您就不必更新该值。当您查询 table.
时,它是正确的
我有一个 table 名为 Client ,我想在更新余额字段后更新可用信用栏。
我创建了这个触发器
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.
检查了一些 Whosebug 的答案并尝试在里面没有更新语句
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
使用 before update
触发器并设置值:
DELIMITER $$
CREATE TRIGGER client_update_balance
BEFORE UPDATE ON client
FOR EACH ROW
BEGIN
set new.AvailableCredit = new.CreditLimit - new.Balance;
END;
想法是您想要更改正在更新的 table 同一行中的值。您不需要单独的 update
事务来执行此操作。您只需要调整数值即可。
也就是说,如果 AvailableCredit
总是 定义为这种差异,您应该使用生成的列。这样,您就不必更新该值。当您查询 table.