我想做的是:
当有新的 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
6条答案
按热度按时间lymnna711#
有同样的问题,但必须更新一个列的id是即将进入,所以你可以做一个更新应该做之前和之后,而不是之前没有id,所以我做了这个把戏
8ulbf1ek2#
在最后一个条目上;这是另一个技巧:
ssm49v7z3#
看来你不可能一蹴而就。根据文件:
在存储的函数或触发器中,不允许修改调用该函数或触发器的语句已在使用(用于读或写)的表。
根据这个答案,你似乎应该:
创建一个存储过程,在事务中插入/更新目标表,然后更新其他行。
使用存储过程,您将手动提交更改(插入和更新)。我在mysql中没有这样做,但这篇文章看起来像是一个很好的例子。
vsikbqxv4#
相反,您可以使用before insert并获取特定表的max pkid,然后更新maximium pkid表记录。
hmmo2u0o5#
7z5jn7bk6#
这就是如何在insert时更新同一表中的行
activationCode
以及email
表中有行吗USER
. 插入时,我没有指定activationCode
,它将由mysql动态创建。改变
username
使用mysql用户名和db_name
用你的db名字。