Autor Zpráva
vojak.p
Profil
Zdravím, mám následující kus kodu:
DELIMITER $$

create trigger  tr_nazev
after update on tabulka
for each row
begin 
DELETE from tabulka WHERE time < Date_add(now(), INTERVAL -1 DAY);
end$$

DELIMITER ;
Který by měl krom jiného zajistit při update tabulky odmazání starších hodnot. To ovšem nefunguje, ale když delete spustím samostatně, tak se provede. Časem k příkazu přibude ještě UPDATE jiné tabulky. Může u toho dotazu nějak dojít k zacyklení, že se neprovede?
juriad
Profil
vojak.p:
http://sqlfiddle.com/#!2/83de21
Odkomentuj ten update a dostaneš chybu:
Schema Creation Failed: Can't update table 'tabulka' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.:
O zacyklení nejde.

Řešením může být vytvořit proceduru, kterou budeš data modifikovat. A ta procedura bued volat i ten delete.
Mimochodem, proč potřebuješ odmazávat data? Bojíš se, že to databáze neutáhne, nebo je na tom závislá aplikační logika?
vojak.p
Profil
Právě že samotnej UPDATE je funkční, tak proč by měl vadit příkaz DELETE? Snažim se o podobnou databázi jako je RRD. A je pro mě zbytečné uchovávat přesné data starší jak nějaký interval. Navíc to není aplikováno na jednu tabulku, ale několik desítek.
juriad
Profil
vojak.p:
Tak použij cron a maž ta data jednou denně a nikoli při každé změně. Takto by to stejně jen zbytečně snižovalo výkon.

Ten problém je způsobený příkazem, který mění aktuálně zpracovávanou tabulku. Co kdybys zrovna chtěl smazat záznam, který se teprve má updatnout? Jenže u UPDATE není definované pořadí (alespoň myslím), mohl bys tedy dostat náhodně různé výsledky.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: