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

时间:2012-10-13 22:50:11

标签: mysql database-trigger

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

当表INSERT中有新的ACCOUNTS时,我需要通过设置{{1}更新ACCOUNTS pk = NEW.edit_on中的行表示特定(旧)帐户已被编辑。

status='E'

要求 NOT 我操纵新插入的列,但已存在的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

请建议解决方法

PS:我已经完成Updating table in trigger after update on the same tableInsert into same table trigger mysqlUpdate with after insert trigger on same tablemysql trigger with insert and update after insert on table,但他们似乎没有回答我的问题。

修改

Can't update table ACCOUNTS ... already used by the statement that invoked this trigger表:

ACCOUNTS

6 个答案:

答案 0 :(得分:23)

似乎你无法在触发器中完成所有这些操作。根据{{​​3}}:

  

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

根据documentation,您似乎应该:

  

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

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

答案 1 :(得分:10)

这就是我在插入

上更新同一个表中的行的方法

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

使用您的mysql用户名更改'username',使用您的db名称更改'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

答案 2 :(得分: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 ;

答案 3 :(得分:2)

在最后一个条目;这是另一个伎俩:

SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_schema = ... and table_name = ...

答案 4 :(得分:0)

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

答案 5 :(得分:0)

DELIMITER $$

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

    SET NEW.STATUS = 'E';

END$$

DELIMITER ;