MySQL 中的触发器限制:更新同一个表
MySQL 触发器提供了一种基于数据库事件执行自动操作的机制。但是,使用触发器更新事件发起的同一表存在一些限制。这是由于限制触发器无法修改调用触发器的语句已在使用的表。
问题陈述
在提供的场景中,任务是在将新行插入到 ACCOUNTS 表中时更新 ACCOUNTS 表中的特定行。但是,更新必须在主键 (pk) 与新行的 edit_on 值匹配的现有行上执行。
触发器实现
建议的触发器语法旨在实现此要求:
DELIMITER $$ DROP TRIGGER IF EXISTS `setEditStatus`$$ CREATE TRIGGER `setEditStatus` AFTER INSERT on ACCOUNTS FOR EACH ROW BEGIN update ACCOUNTS set status='E' where ACCOUNTS.pk = NEW.edit_on ; END$$ DELIMITER ;
执行错误
不幸的是,由于前面提到的限制,执行此触发器会导致错误:“无法更新表 ACCOUNTS ... 已被调用此触发器的语句使用。”
使用存储过程的解决方法
由于触发器不能用于此目的,因此另一种方法是创建存储过程。存储过程允许在单个事务中执行多个操作,包括插入 ACCOUNTS 表和更新现有行。
以下是完成该任务的示例存储过程:
CREATE PROCEDURE `updateAccountStatus` (IN NEW_ROW_ID INT) BEGIN -- Insert into the ACCOUNTS table INSERT INTO ACCOUNTS (user_id, edit_on, status) VALUES (NEW.user_id, NEW.edit_on, 'A'); -- Update the existing row UPDATE ACCOUNTS SET status = 'E' WHERE pk = NEW_ROW_ID; -- Commit the changes COMMIT; END
通过使用新插入行的ID调用存储过程,插入和更新操作都可以在单个事务中执行,绕过触发器限制。
以上是如何在 INSERT 操作后更新 MySQL 触发器中的同一表?的详细内容。更多信息请关注PHP中文网其他相关文章!