首页 > 数据库 > mysql教程 > 如何在 INSERT 操作后更新 MySQL 触发器中的同一表?

如何在 INSERT 操作后更新 MySQL 触发器中的同一表?

Linda Hamilton
发布: 2024-12-20 11:16:10
原创
772 人浏览过

How Can I Update the Same Table Within a MySQL Trigger After an INSERT Operation?

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板