Autor | Zpráva | ||
---|---|---|---|
err Profil * |
#1 · Zasláno: 7. 8. 2022, 22:08:53
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 |
#2 · Zasláno: 8. 8. 2022, 09:10:56
Některé databáze nebo jejich novější verze umí stromové dotazy.
|
||
N71 Profil * |
#3 · Zasláno: 8. 8. 2022, 21:10:40
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 * |
#4 · Zasláno: 9. 8. 2022, 02:13:25
N71:
Já nechci aby se to smazalo, ale jen označilo jako smazané... |
||
tttttttt Profil * |
#5 · Zasláno: 9. 8. 2022, 02:34:14
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) 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. |
||
Časová prodleva: 2 roky
|
0