/ / Błąd wyzwalacza, MySQL - mysql, sql, triggers

Błąd wyzwalacza, MySQL - mysql, sql, triggers

Cóż, zbadałem i nie znalazłem rozwiązania następującego problemu "SQL Error (1442): Can not update table" messages" in stored function / trigger because it is already used by statement Which invoked this stored function / trigger. `

Mój wyzwalacz jest tworzony, tylko gdy uruchomię INSERT w tabeli komunikatów, ten błąd jest generowany, moim wyzwalaczem jest

DELIMITER $$
DROP TRIGGER IF EXISTS `onMessage` ;
CREATE TRIGGER `onMessage` BEFORE INSERT ON `messages` FOR EACH ROW
BEGIN
UPDATE `users` SET `users`.`messages` = ( `users`.`messages` + 1 )
WHERE `users`.`uid` = NEW.uid ;
DELETE FROM `messages` WHERE `date` < ( NOW( ) - INTERVAL 1 MINUTE ) ;
END ;
$$
DELIMITER ;

Odpowiedzi:

4 dla odpowiedzi № 1

Jest to ograniczenie w używaniu wyzwalaczy.

Z MySql dokumentacje:

W ramach funkcji zapisanej lub wyzwalacza nie można modyfikować tabeli, która jest już używana (do odczytu lub zapisu) przez instrukcję, która wywołała funkcję lub wyzwalacz.


2 dla odpowiedzi nr 2

Tak czy inaczej, w przypadku MySQL

Nie można pisać do tabeli skojarzonej z wyzwalaczem w tym wyzwalaczu, generuje on wszelkie niespójności, między innymi dlatego, że wyzwalacze MySQL są przetwarzane rząd po rzędzie (RBAR)

W tym przypadku użyłbym procedury przechowywanej do obsługi INSERT messages


0 dla odpowiedzi № 3

Nie można aktualizować tabeli, dla którejwyzwalacz jest tworzony w wyzwalaczu, ponieważ Mysql robi pewne rzeczy blokujące na tej tabeli. Dlatego nie można wstawiać / aktualizować / usuwać wierszy z tej samej tabeli, ponieważ wówczas wyzwalacz byłby wywoływany wielokrotnie, kończąc na rekursji.

Jeśli chcesz utworzyć wyzwalacz w tabeli, który się zaktualizuje (w tym przypadku perfekcja usunięcia), upewnij się, że używasz NEW.column_name aby odnosić się do wiersza po jego aktualizacji.