Autor Zpráva
mArt
Profil *
Ahoj,
nevím, jestli jsem nadpis tohoto vlákna napsal dostatečně obratně... takže trochu podrobněji. Mám tabulku, kde každý záznam má svou pozici. Pozice určuje pozici zobrazení a každý uživatel si své záznamy může seřadit podle svého uvážení (pozice záznamu není to samé jako id záznamu!). Trigger má provádět to, že zachovává integritu posloupnosti pozic. Např.: mám-li 5 záznamů = 5 různých pozic (1 až 5) a smažu první záznam s pozicí 1, tak se všechny následující pozice sníží o jedničku.

Založil jsem následující trigger:
CREATE TRIGGER `update_position`
	AFTER DELETE ON `object`
	FOR EACH ROW				
		UPDATE `object`
			SET `position` = `position`-1
			WHERE `position` > OLD.`position` AND `id_object` = OLD.`id_object`; 


A chybová hláška je následující: #1442 - Can't update table 'object_person' in stored function/trigger because it is already used by statement which invoked this stored function/trigger

Jak to mohu vyřešit a jde to vůbec vyřešit nějak elegantně, aniž bych musel přidělávat novou pomocnou tabulku, kde budou uloženy jednotlivé pozice?
Kajman_
Profil *
before delete
mArt
Profil *
[#2] Kajman:
BEFORE jsem také z nouze už zkoušel, ale výsledek je stejný. Zatím se tomu bráním, a čekám zda někdo přijde s nějakým řešením, ale asi si budu muset udělat tu pomocnou tabulku. Vůbec se mi do toho nechce... :)
paranoiq
Profil *
proč to prostě neuděláš dvěma dotazy v transakci?

trigger tabulku upravovat nemůže. je to způsob jak se mysql brání nechtěnému spuštění laviny triggerů
mArt
Profil *
[#4] paranoiq:
Abych pravdu řekl, tak k transakcím jsem ještě nedošel :) Jdu si o nich něco přečíst, ale i tak bych tě poprosil. Můžeš mi prosím ukázat, jak bys tento jednoduchý příklad řešil?
Dikes
mArt
Profil *
[#4] paranoiq:
Tak jsem si teď procházel materiály o transakcích a myslím že se mi to bude brzo hodit, děkuji za tip, ale neřeší to můj současný problém :(

Ještě než toto téma úplně odepíšu, chtěl bych se zeptat... Jelikož triggey nevrací hodnotu, jak mohu bez použití PHPka získat hodnoty právě smazaného řádku? Myslím tím obdobu OLD. popř. NEW. z triggeru abych s ní mohl dál pracovat?

Konkrétně mám namysli tuhle část dotazu:
...
WHERE `position` > OLD.`position` AND `id_object` = OLD.`id_object`; 
Kajman_
Profil *
Pardon za nesmysl s before.

jak mohu bez použití PHPka získat hodnoty právě smazaného řádku?
Např do uživatelské proměnné si můžete před mazáním uložit výsledek selectu, ten pak použít v update.

Jinak pokud takové mazání chcete řešit z různých míst, může být výhodné vytvořit uloženou proceduru a tu pak volat místo mazání.
mArt
Profil *
Tak jsem to nakonec opravu "vyřešil" pomocí TRANSAKCE, ale naskytl se nový problém... :D Viz nové vlákno "Jak spustit TRANSAKCTION nebo založit TRIGGER přes php".

[#7] Kajman
Do procedur a funkcí jsem se v MySQL ještě nepouštěl, takže nemám tušení jak na ně, teda prozatím... :)

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: