/ / Erreur de déclenchement, MySQL - mysql, sql, triggers

Erreur de déclenchement, MySQL - mysql, sql, triggers

Eh bien, j'ai recherché et n'ai pas trouvé de solution au problème suivant "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. `

Mon déclencheur est créé, uniquement lorsque je lance INSERT sur la table des messages, cette erreur est générée, mon déclencheur est

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 ;

Réponses:

4 pour la réponse № 1

Ceci est une restriction dans l'utilisation de déclencheurs.

Du MySql documentations:

Dans une fonction ou un déclencheur stocké, il n'est pas autorisé de modifier une table déjà utilisée (pour la lecture ou l'écriture) par l'instruction ayant appelé la fonction ou le déclencheur.


2 pour la réponse № 2

Correct, pour MySQL quand même

Vous ne pouvez pas "écrire dans la table associée à un déclencheur dans ce déclencheur. Il génère toutes sortes d’incohérences, notamment parce que les déclencheurs MySQL sont traités ligne par ligne (RBAR).

Dans ce cas, j’utiliserais une procédure stockée pour traiter le message INSERT le messages


0 pour la réponse № 3

Il n'est pas possible de mettre à jour une table pour laquellele déclencheur est créé dans le déclencheur puisque Mysql effectue des opérations de verrouillage sur cette table. Par conséquent, vous ne pouvez pas "insérer / mettre à jour / supprimer des lignes de la même table car le déclencheur serait alors appelé à plusieurs reprises, aboutissant à une récursion.

Si vous souhaitez créer un déclencheur sur la table qui se mettra à jour automatiquement (dans ce cas, une suppression est effectuée), assurez-vous d'utiliser le NEW.column_name faire référence à la ligne après sa mise à jour.