一尘不染

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

mysql

这是我想做的事情:

INSERT表中有新记录时ACCOUNTS,我需要通过设置以表示特定(旧)帐户已被编辑来更新ACCOUNTSwhere
pk=中的行。NEW.edit_on``status='E'

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

但是,我无法更新同一张表: Can't update table ACCOUNTS ... already used by the statement that invoked this trigger

请提出解决方法

PS:我已经走过了更新表触发器在同一个表更新后插入到相同的表触发的mysql更新与后同桌INSERT触发器表后插入MySQL的触发器与插入和更新,但他们似乎没有给答案我的问题。

编辑

ACCOUNTS 表:

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

阅读 398

收藏
2020-05-17

共1个答案

一尘不染

似乎您无法在触发器中完成所有这些操作。根据文档

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

根据此答案,您似乎应该:

创建一个存储过程,该过程将插入/更新目标表,然后更新事务中的所有其他行。

使用存储的proc,您将手动提交更改(插入和更新)。我还没有在MySQL中做到这一点,但是这篇文章看起来像一个很好的例子。

2020-05-17