Briser référence circulaire nécessaire une autre table par exemple:
CREATE TABLE `trigger_semaphore` (
`id` INTEGER(11) NOT NULL,
`semaphore` INTEGER(11) DEFAULT NULL,
`actions` VARCHAR(20) COLLATE utf8_general_ci DEFAULT NULL,
`random` INTEGER(11) DEFAULT NULL,
PRIMARY KEY (`id`)
)ENGINE=MyISAM
CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci';
CREATE DEFINER = 'root'@'localhost' TRIGGER `trigger_semaphore_before_upd_tr`
BEFORE UPDATE ON `trigger_semaphore`
FOR EACH ROW
BEGIN
DECLARE semaphore int;
set New.random=RAND()*1000;
if New.actions='++' then
set New.semaphore=COALESCE(New.semaphore,0)+1;
elseif New.actions='--' then
set semaphore= COALESCE(New.semaphore,0);
if semaphore<=0 then
set New.semaphore=semaphore;
else
set New.semaphore=semaphore-1;
end if;
end if;
END;
Dans les déclencheurs pour les tableaux qui mettent à jour chaque autre table utilisation de trigger_semaphore ainsi:
update trigger_semaphore set actions='++' where id=1;
select semaphore into _semaphore from trigger_semaphore where id=1;
if _semaphore=1 then
# ...... Here goes the code without circular reference..........
end if;
Relâchez le sémaphores maintenant à la fin du déclencheur
update trigger_semaphore set actions='--' where id=1;
En bref, la table qui définit le premier sémaphore (1) ne pourra exécuter que certaines instructions . Vous pouvez utiliser une méthode simple une fois que vous avez l'idée;)
lorsque j'utilise la même table pour toutes les opérations de déclenchement j'ai eu cette erreur. – maxy
@maxy, à droite, je m'en rends compte. C'est ce que j'essaie d'expliquer dans ma réponse; Vous ne pouvez pas avoir une référence circulaire directe, et, vous devez casser la récursivité ... – mjv
comment puis-je casser cela..avoir une autre solution pour cela .. – maxy