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 № 1Jest 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.