且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-12-12 15:55:35

实际上可以将触发器放在同一个表中的行。



$ p> TestTable(id / lastmodified / random)

创建触发器insert_lastmod
在TestTable上插入
每行
set NEW。 lastmodified = NOW();

插入TestTable(`random`)值('Random');

select * from TestTable;
+ ---- + --------------------- + ------------------ --- +
| id |最后修改|随机|
+ ---- + --------------------- + ------------------ --- +
| 1 | 2010-12-22 14:15:23 |随机|
+ ---- + --------------------- + ------------------ --- +


MySQL doesn't currently support updating rows in the same table the trigger is assigned to since the call could become recursive. Does anyone have suggestions on a good workaround/alternative? Right now my plan is to call a stored procedure that performs the logic I really wanted in a trigger, but I'd love to hear how others have gotten around this limitation.

Edit: A little more background as requested. I have a table that stores product attribute assignments. When a new parent product record is inserted, I'd like the trigger to perform a corresponding insert in the same table for each child record. This denormalization is necessary for performance. MySQL doesn't support this and throws:

Can't update table 'mytable' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. A long discussion on the issue on the MySQL forums basically lead to: Use a stored proc, which is what I went with for now.

Thanks in advance!

You can actually up the rows in the same table as the trigger. The thread you linked to even has the solution.

For example:

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              |
+----+---------------------+---------------------+