Autor Zpráva
Taps
Profil
Zdravím, v admineru mám níže uveden trigger, který se má provádět po update
Kód:

IF (NEW.skore>=5)
THEN
UPDATE zavodnici SET NEW.idKategorie = 3;
END IF

, ale bohužel se mi zobrazuje níže uvedená chyba

Can't update table 'zavodnici' in stored function/trigger because it is already used by statement which invoked this stored function/trigger

Mohl by mi někdo poradit jak problém odstranit . Trigger mám definovaný na stejné tabulce, do které provádím update

Děkuji
Rfilip
Profil
Trigger nemůže manipulovat s tabulkou v které se provádí změny vyvolavající trigger - protože to vede k nekonečné rekurzy. V tvém případě by k ní došlo vždy pokud je skore>=5 - vykoná se update z PHP ten spustí trigger ten provede update ten spustí trigger.... teoreticky až do nekonečna (prakticky až do vyčerpání paměti). MySQL tímto pravidlem chrání server.
Tu podmínku udělej už v PHP při tvorbě SQL a SQL příslušně změn
Taps
Profil
Rfilip:
Díky za info, nakonec jsem v admineru napsal proceduru a tu volám z php skriptu
juriad
Profil
Taps:
Ukaž celý trigger, včetně hlavičky (kdy se má spouštět); nejspíše ho lze napsat tak, aby fungoval.


Mohlo by fungovat něco jako:
CREATE TRIGGER my_trigger
BEFORE UPDATE 
ON my_table FOR EACH ROW
BEGIN
  IF (NEW.skore >= 5) THEN
    SET NEW.idKategorie = 3;
  END IF
END;
Taps
Profil
juriad:
Trigger se má provést po příkazu UPDATE, který aktualizuje skore
zkusil jsem použít tvůj příkaz, ale zobrazila se mi chyba, viz http://imgup.cz/F9S
Alphard
Profil
Použij before.
Taps
Profil
Alphard, juriad:
Děkuji, již funguje tak jak má.

Můžete mě prosím ještě poradit, jak trigger rozvinout o příkaz update ? Děkuji
BEGIN
IF (NEW.skore >= 5) THEN
SET NEW.idKategorie = 2;
END IF;
 IF @aff_rows > 0 THEN
       UPDATE zavodnici SET idKategorie=1 WHERE idKategorie=3 ORDER BY RAND() limit 1
    END IF;
END

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: