Autor | Zpráva | ||
---|---|---|---|
Taps Profil |
#1 · Zasláno: 27. 12. 2013, 15:50:26
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 |
#2 · Zasláno: 27. 12. 2013, 16:52:51
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 |
#3 · Zasláno: 27. 12. 2013, 17:13:29
Rfilip:
Díky za info, nakonec jsem v admineru napsal proceduru a tu volám z php skriptu |
||
juriad Profil |
#4 · Zasláno: 27. 12. 2013, 19:20:17 · Upravil/a: juriad
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 |
#6 · Zasláno: 27. 12. 2013, 21:27:53
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 |
||
Časová prodleva: 10 let
|
0