Триггеры MySQL не могут обновлять строки в той же таблице, которой назначен триггер. Предлагаемый обходной путь? - PullRequest
5 голосов
/ 25 февраля 2010

MySQL в настоящее время не поддерживает обновление строк в той же таблице, для которой назначен триггер, поскольку вызов может стать рекурсивным. У кого-нибудь есть предложения по хорошему обходному пути / альтернативе? Сейчас я планирую вызвать хранимую процедуру, которая выполняет логику, которую я действительно хотел, в триггере, но я бы хотел услышать, как другие обошли это ограничение.

Редактировать: немного больше фона в соответствии с просьбой. У меня есть таблица, в которой хранятся присвоения атрибутов товара. Когда вставляется новая запись родительского продукта, я бы хотел, чтобы триггер выполнил соответствующую вставку в той же таблице для каждой дочерней записи. Эта денормализация необходима для производительности. MySQL не поддерживает это и выдает:

Can't update table 'mytable' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. Длительное обсуждение проблемы на форумах MySQL в основном привело к: Использовать хранимый процесс, что я и использовал сейчас.

Заранее спасибо!

Ответы [ 5 ]

2 голосов
/ 22 декабря 2010

Вы можете на самом деле вверх строки в той же таблице, что и триггер. У нити, с которой вы связаны, даже есть решение.

Например:

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              |
+----+---------------------+---------------------+
1 голос
/ 26 февраля 2010

Полагаю, вы можете вызвать сохраненный процесс в вашем триггере. ОДНАКО, если вы хотите обновить некоторые поля в тех же записях, которые вы изменяете (например, столбец updatedby или lastupdated), вы можете сделать это в триггере beofre согласно руководству по ссылкам. http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html

Это обычная операция для триггеров, и мне трудно поверить, что она не поддерживается.

0 голосов
/ 25 марта 2013

Это сработало для меня: D

Вкл. До / обновление.

BEGIN
 SET NEW.DateTimeUpdated = NOW();
END
0 голосов
/ 17 сентября 2012

Вы действительно можете сделать это Ниже приведен пример для того же

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;
0 голосов
/ 16 июня 2012

Если вы хотите обновить столбец, который не читается в функции триггера, то в качестве обходного пути вы можете поместить этот столбец в отдельную таблицу.

...