Autor Zpráva
err
Profil *
Ahoj... mám tuto tabulku

folders:
id, name, parent_folder_id, is_del

Když smažu (resp. update is_del na hodnotu 1) jednu složku, chci aby se smazali i děti...

Jak na to? Napadá vás něco?
Kajman
Profil
Některé databáze nebo jejich novější verze umí stromové dotazy.
N71
Profil *
Pokud má parent_folder_id nastaven cizí klíč na nadřazený záznam a ty jej smažeš (nastavit is_del na 1 nebude bohužel stačit), tak se ta událost podle nastaveného pravidla může automaticky kaskádovat dál, to je běžná operace s cizími klíči, kterou umí prakticky každá databáze.
err
Profil *
N71:
Já nechci aby se to smazalo, ale jen označilo jako smazané...
tttttttt
Profil *
err:
Po smazání položky zalovej rekurzivně i smazání dětí. Může to být ve funkci v aplikaci, můžeš to vytvořit jako trigger v databázi. Nebo si předem zjisti id všech záznamů a pak je smaž, k tomu se budou hodit rekurzivní dotazy, jak psal Kajman.

Taky můžeš nahradit sloupec is_del triggerem, který před smazáním záznam zapíše do archivní tabulky. Pak půjde použít kaskádované mazání poskytované databází a vyhneš se filtrování smazaných záznamů.
err
Profil *
tttttttt:
prozatím jsem to udělal krkolomně, zjistil jsem si v rekurzivním voláním všechny podsložky a potom jsem je nastavil na is_del = 1;

Ale našel jsem tento článek....
blog.voracek.net/databaze/closure-table-stromy-v-mysql-trochu-jinak
Akorát nevím jak to mám přepsat a zda by něco z toho bylo pro mě řešením... zkoušel jsem
UPDATE fd_folders SET is_del = 1 WHERE is_del = 0 AND parent_folder_id IN (SELECT id FROM fd_folders WHERE is_del = 0 AND parent_folder_id = 2)
:-(... on tam má dvě tabulky... přímo v tom mysql by to nějak zacyklit nešlo?


Kajman:
nenašel jsem nic o tom :-(
Kajman
Profil
V tom článku se používá metoda s předpočítanými sloupečky, díky kterým se pak dají dělat stromové dotazy. Musíte se ale o předpočítané sloupečky starat, aby souhlasily při úpravách stromu. Někdy se používá i traverzování kolem stromu - tam je jen jedna tabulka. To se u mysql používalo před těmi 10 lety, protože neuměla to, co umí od verze 8.0.

dev.mysql.com/doc/refman/8.0/en/with.html#common-table-expressions-recursive

Pokud máte starší verzi a je složitější přejít na mysql 8+ nebo mariadb 10.2.2+ než si naprogramovat to traverzování, tak to můžete použít.

Ale pokud máte jen tu prastarou verzi a nepoběží to nikde na důležitém místě, tak můžete udělat i update těch složek, které mají rodiče označeného is_del a sami nejsou is_del. A toto budete pouštět tolikrát, dokud do změní alespoň jeden řádek.

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:

0