MySQL - 插入后更新同一张表的触发器

MySQL - Trigger for updating same table after insert(MySQL - 插入后更新同一张表的触发器)
本文介绍了MySQL - 插入后更新同一张表的触发器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我想要做的:

当有一个新的 INSERT 到表 ACCOUNTS 中时,我需要更新 ACCOUNTS 中的行 pk = NEW.edit_on 通过设置 status='E' 来表示特定(旧)帐户已被编辑.

When there's a new INSERT into the table ACCOUNTS, I need to update the row in ACCOUNTS where pk = NEW.edit_on by setting status='E' to denote that the particular (old) account has been edited.

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 ;

要求我操作 新插入的列,而是 已经存在pk = NEW.edit_on

The requirement is NOT that I manipulate the newly inserted column, but an already existing column with pk = NEW.edit_on

但是,我无法更新同一张表:无法更新表 ACCOUNTS ... 已被调用此触发器的语句使用

However, I can't update the same table: Can't update table ACCOUNTS ... already used by the statement that invoked this trigger

请提出解决方法

PS:我已经完成了 更新表在同一张表更新后触发,插入同一张表触发mysql, 在同一张表上使用插入后触发器更新和 mysql 在表上插入和更新后触发 但他们似乎没有回答我的问题.

PS: I have already gone through Updating table in trigger after update on the same table, Insert into same table trigger mysql, Update with after insert trigger on same table and mysql trigger with insert and update after insert on table but they dont seem to answer my question.

编辑

账户表:

CREATE TABLE  `ACCOUNTS` (
  `pk` bigint(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(9) unsigned NOT NULL,
  `edit_on` bigint(10) unsigned DEFAULT NULL,
  `status` varchar(1) NOT NULL DEFAULT 'A',
  PRIMARY KEY (`pk`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=2147483726 DEFAULT CHARSET=latin1

推荐答案

看来你不能在一个触发器中完成这一切.根据文档:

It seems that you can't do all this in a trigger. According to the documentation:

在存储的函数或触发器中,不允许修改已被调用函数或触发器的语句使用(用于读取或写入)的表.

Within a stored function or trigger, it is not permitted to modify a table that is already being used (for reading or writing) by the statement that invoked the function or trigger.

根据 这个答案,看来你应该:

创建一个存储过程,插入/更新目标表,然后更新其他行,所有这些都在一个事务中.

create a stored procedure, that inserts into/Updates the target table, then updates the other row(s), all in a transaction.

使用存储过程,您将手动提交更改(插入和更新).我没有在 MySQL 中这样做,但 这篇文章 看起来不错例子.

With a stored proc you'll manually commit the changes (insert and update). I haven't done this in MySQL, but this post looks like a good example.

这篇关于MySQL - 插入后更新同一张表的触发器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Hibernate reactive No Vert.x context active in aws rds(AWS RDS中的休眠反应性非Vert.x上下文处于活动状态)
Bulk insert with mysql2 and NodeJs throws 500(使用mysql2和NodeJS的大容量插入抛出500)
Flask + PyMySQL giving error no attribute #39;settimeout#39;(FlASK+PyMySQL给出错误,没有属性#39;setTimeout#39;)
auto_increment column for a group of rows?(一组行的AUTO_INCREMENT列?)
Sort by ID DESC(按ID代码排序)
SQL/MySQL: split a quantity value into multiple rows by date(SQL/MySQL:按日期将数量值拆分为多行)