插入后更新相同表的触发器

hi3rlvi2  于 2021-06-15  发布在  Mysql
关注(0)|答案(6)|浏览(387)

我想做的是:
当有新的 INSERT 放进table里 ACCOUNTS ,我需要更新中的行 ACCOUNTS 哪里 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,在同一个表中使用插入后触发器更新,在表中使用插入和插入后更新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
mu0hgdu0

mu0hgdu01#

DELIMITER $$

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

    SET NEW.STATUS = 'E';

END$$

DELIMITER ;
syqv5f0l

syqv5f0l2#

看来你不可能一蹴而就。根据文件:
在存储的函数或触发器中,不允许修改调用该函数或触发器的语句已在使用(用于读或写)的表。
根据这个答案,你似乎应该:
创建一个存储过程,在事务中插入/更新目标表,然后更新其他行。
使用存储过程,您将手动提交更改(插入和更新)。我在mysql中没有这样做,但这篇文章看起来像是一个很好的例子。

tf7tbtn2

tf7tbtn23#

相反,您可以使用before insert并获取特定表的max pkid,然后更新maximium pkid表记录。

guz6ccqo

guz6ccqo4#

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

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

yruzcnhs5#

这就是如何在insert时更新同一表中的行 activationCode 以及 email 表中有行吗 USER . 插入时,我没有指定 activationCode ,它将由mysql动态创建。
改变 username 使用mysql用户名和 db_name 用你的db名字。

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
eqoofvh9

eqoofvh96#

有同样的问题,但必须更新一个列的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 ;

相关问题