插入后更新同一个表中现有行的 MySQL 触发器
问题陈述
何时一个新行被插入到 ACCOUNTS 表中,同一个表中对应的现有行的 pk 相等新插入行的 edit_on 列需要通过将其状态列设置为“E”来更新。但是,在触发器内尝试此更新时会发生错误,指出该表已被调用触发器的语句使用。
解决方案
由于由于对更新已被触发语句修改的触发器内的表的限制,需要采用替代方法。
已存储过程
创建一个存储过程,在单个事务中处理插入和更新操作。涉及的步骤如下:
SQL 语法
CREATE PROCEDURE setEditStatus(IN NEW_pk INT, IN NEW_edit_on INT) BEGIN /* Insert new row into ACCOUNTS table */ INSERT INTO ACCOUNTS (pk, user_id, edit_on, status) VALUES (NEW_pk, /* User ID */, NEW_edit_on, 'A'); /* Update existing row */ UPDATE ACCOUNTS SET status = 'E' WHERE pk = NEW_edit_on; /* Commit changes */ COMMIT; END;
触发器
修改触发器以调用存储过程直接尝试更新。
DELIMITER $$ DROP TRIGGER IF EXISTS `setEditStatus`$$ CREATE TRIGGER `setEditStatus` AFTER INSERT on ACCOUNTS FOR EACH ROW BEGIN CALL setEditStatus(NEW.pk, NEW.edit_on); END$$ DELIMITER ;
此解决方法允许希望在不违反触发器内更新同一表的限制的情况下执行更新。
以上是如何在插入后更新 MySQL 中的现有行而不使用触发器锁定?的详细内容。更多信息请关注PHP中文网其他相关文章!