Autor | Zpráva | ||
---|---|---|---|
mArt Profil * |
#1 · Zasláno: 8. 1. 2011, 18:24:40
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 * |
#2 · Zasláno: 9. 1. 2011, 09:14:17
before delete
|
||
mArt Profil * |
#3 · Zasláno: 9. 1. 2011, 13:59:05
[#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 * |
#4 · Zasláno: 9. 1. 2011, 16:13:59
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 * |
#5 · Zasláno: 9. 1. 2011, 20:36:49
[#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 * |
#6 · Zasláno: 9. 1. 2011, 23:01:36
[#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 * |
#7 · Zasláno: 10. 1. 2011, 08:49:18
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 * |
#8 · Zasláno: 10. 1. 2011, 14:16:49
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... :) |
||
Časová prodleva: 13 let
|
0