33

这是我正在尝试做的事情:

INSERT当表格中有新内容时ACCOUNTS,我需要通过设置来更新ACCOUNTSwhere pk=中的行,以表示特定(旧)帐户已被编辑。NEW.edit_onstatus='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在同一张表上使用插入触发器后更新,在表上插入后使用插入和更新的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
4

6 回答 6

32

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

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

根据this answer,您似乎应该:

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

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

于 2012-10-14T00:04:57.557 回答
14

这就是我如何在插入时更新同一个表中的一行

activationCode并且email是表中的行USER。在插入时,我没有为 指定值activationCode,它将由 MySQL 动态创建。

username使用您的 MySQL 用户名和您的数据库名称进行更改db_name

CREATE DEFINER=`username`@`localhost` 
       TRIGGER `db_name`.`user_BEFORE_INSERT` 
       BEFORE INSERT ON `user` 
       FOR EACH ROW
         BEGIN
            SET new.activationCode = MD5(new.email);
         END
于 2015-04-10T10:32:14.050 回答
5

有同样的问题,但必须用即将输入的 id 更新列,所以你可以在没有 id 之前和之后进行更新,所以我做了这个技巧

DELIMITER $$
DROP TRIGGER IF EXISTS `codigo_video`$$
CREATE TRIGGER `codigo_video` BEFORE INSERT ON `videos` 
FOR EACH ROW BEGIN
    DECLARE ultimo_id, proximo_id INT(11);
    SELECT id INTO ultimo_id FROM videos ORDER BY id DESC LIMIT 1;
    SET proximo_id = ultimo_id+1;
    SET NEW.cassette = CONCAT(NEW.cassette, LPAD(proximo_id, 5, '0'));
END$$
DELIMITER ;
于 2013-06-18T03:15:17.747 回答
1

在最后一个条目上;这是另一个技巧:

SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_schema = ... and table_name = ...
于 2016-03-28T10:28:29.067 回答
0
DELIMITER $$

DROP TRIGGER IF EXISTS `setEditStatus`$$
CREATE TRIGGER `setEditStatus` **BEFORE** INSERT on ACCOUNTS
FOR EACH ROW BEGIN

    SET NEW.STATUS = 'E';

END$$

DELIMITER ;
于 2019-08-01T11:10:39.577 回答
0

相反,您可以在插入之前使用并获取特定表的最大 pkid,然后更新最大 pkid 表记录。

于 2018-07-13T10:58:08.083 回答