MySQL触发器无法更新触发器分配给的同一个表中的行。建议的解决方法?

MySQL触发器无法更新触发器分配给的同一个表中的行。建议的解决方法?,mysql,database,database-design,stored-procedures,triggers,Mysql,Database,Database Design,Stored Procedures,Triggers,MySQL目前不支持更新触发器分配给的同一个表中的行,因为调用可能是递归的。是否有人对一个好的解决方法/备选方案提出建议?现在我的计划是调用一个存储过程来执行触发器中我真正想要的逻辑,但我很想听听其他人是如何绕过这个限制的 编辑:根据要求增加一点背景。我有一个存储产品属性分配的表。插入新的父产品记录时,我希望触发器为每个子记录在同一个表中执行相应的插入。这种非规范化对于性能是必要的。MySQL不支持此操作,并抛出: 无法更新存储函数/触发器中的表'mytable',因为调用此存储函数/触发器的语

MySQL目前不支持更新触发器分配给的同一个表中的行,因为调用可能是递归的。是否有人对一个好的解决方法/备选方案提出建议?现在我的计划是调用一个存储过程来执行触发器中我真正想要的逻辑,但我很想听听其他人是如何绕过这个限制的

编辑:根据要求增加一点背景。我有一个存储产品属性分配的表。插入新的父产品记录时,我希望触发器为每个子记录在同一个表中执行相应的插入。这种非规范化对于性能是必要的。MySQL不支持此操作,并抛出:

无法更新存储函数/触发器中的表'mytable',因为调用此存储函数/触发器的语句已经使用了它。
关于基本上导致以下问题的长时间讨论:使用存储过程,这就是我现在使用的


提前谢谢

我想您可以调用触发器中存储的进程。但是,如果您想更新正在更改的相同记录中的某些字段(例如updatedby或lastupdated列),则可以根据参考手册在beofre触发器中执行此操作


这是触发器的常见操作,我发现很难相信它不受支持

您实际上可以在触发器所在的同一个表中增加行。您链接到的线程甚至有解决方案

例如:

TestTable ( id / lastmodified / random )

create trigger insert_lastmod
before insert on TestTable
for each row
set NEW.lastmodified = NOW();

insert into TestTable ( `random` ) values ( 'Random' );

select * from TestTable;
+----+---------------------+---------------------+
| id | lastmodified        | random              |
+----+---------------------+---------------------+
|  1 | 2010-12-22 14:15:23 | Random              |
+----+---------------------+---------------------+

若要更新触发器函数中未读取的列,则作为一种解决方法,可以将该列放入单独的表中。

实际上可以这样做 下面是一个同样的例子

DELIMITER $$
create trigger test2 
before insert on ptrt 
for each row 
begin 
if NEW.DType = "A" then 
set NEW.PA = 500; 

elseif NEW.DType = "B" then 
set NEW.PA = 1000; 

else 
set NEW.PA = 0; 
END IF; 
END;$$

DELIMITER;
这对我有用:D

在更新之前打开

BEGIN
 SET NEW.DateTimeUpdated = NOW();
END

请在您的问题中添加更多细节。您试图在这些更新中实现什么?您是否尝试更新insert update或delete包含的行以外的行?您是否找到了解决方案当具有唯一字段的一行被更新时,我还需要更新同一表中的多行。遗憾的是,当触发器运行时,我需要在同一个表中更新或插入多行。当触发器运行时,我需要在同一个表中更新或插入多行。除非我弄错了,否则这仍然不受支持。上面的示例在insert触发器触发时更新同一个表。您只操作刚刚插入的行。此问题是关于在插入给定行时操作表中的其他现有行。这不适用于问题所需的同一列上的多个值。