首页 >数据库 >mysql教程 >如何在插入后更新 MySQL 中的现有行而不使用触发器锁定?

如何在插入后更新 MySQL 中的现有行而不使用触发器锁定?

Patricia Arquette
Patricia Arquette原创
2024-12-13 00:28:09811浏览

How to Update an Existing Row in MySQL After an Insert Without Trigger Locking?

插入后更新同一个表中现有行的 MySQL 触发器

问题陈述

何时一个新行被插入到 ACCOUNTS 表中,同一个表中对应的现有行的 pk 相等新插入行的 edit_on 列需要通过将其状态列设置为“E”来更新。但是,在触发器内尝试此更新时会发生错误,指出该表已被调用触发器的语句使用。

解决方案

由于由于对更新已被触发语句修改的触发器内的表的限制,需要采用替代方法。

已存储过程

创建一个存储过程,在单个事务中处理插入和更新操作。涉及的步骤如下:

  1. 将新行插入 ACCOUNTS 表。
  2. 更新 pk 与新插入行的 edit_on 列匹配的现有行,设置状态列为“E”。
  3. 提交交易以完成

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn