Autor | Zpráva | ||
---|---|---|---|
kozusnikjan Profil * |
#1 · Zasláno: 21. 12. 2014, 19:48:29
Ahoj, prosím Vás, potřeboval bych poradit nebo navést, jak vyřešit toto:
Mám tabulky: texts_files, products_files, galleries_files. Struktura je stejná - sloupec object_id a sloupec file_id. A já potřebuji udělat toto: Smažu soubor s nějaký file_id a potřebuji, aby se smazaly všechny řádky s daným file_id i ve všech výše zmíněných tabulkách. Tzn. smažu soubor s id 60, tak at' se mi smažou řádky s file_id = 60 v daných tabulkách. Nechci použít více dotazů, ale chtit to dát do jednoho. Napadlo mě něco takového, ale nefunguje to... Máte nápad, jak tohle řešit? Děkuji :) $query = 'DELETE products_files, texts_files, galleries_files FROM products_files LEFT JOIN texts_files ON texts_files.file_id = products_files.file_id LEFT JOIN galleries_files ON galleries_files.file_id = products_files.file_id WHERE products_files.file_id = '.$id.' OR texts_files.file_id = '.$id.' OR galleries_files.file_id = '.$id.''; |
||
Alphard Profil |
#2 · Zasláno: 21. 12. 2014, 19:59:53
Jaký je vztah mezi těmi tabulkami? Pokud je navázané na nějaký produkt, který je mazán, nebylo by rozumné použít cizí klíče?
Jinak k tomu dotazu, vypisují se nějaké chyby? Zkoušel jste to upravit na select a podívat se, co to vrátí? Na první pohled se mi zdá, že by to mohlo fungovat. |
||
kozusnikjan Profil * |
#3 · Zasláno: 21. 12. 2014, 20:08:05
Žádné cizí klíče nejsou. Struktura tabulek vypadá takto:
files - id souboru, cesta k souboru... products - produkty texts - texty products_files - soubory k produktům texts_files - soubory k textům Při zavolání funkce mi to vrátí "smazáno 0 řádků" .... žádná chyba |
||
Taps Profil |
#4 · Zasláno: 21. 12. 2014, 23:10:41
kozusnikjan:
A existují tedy nějaké vazby mezi samotnými tabulkami? |
||
kozusnikjan Profil * |
#5 · Zasláno: 21. 12. 2014, 23:42:03
Nene, vše se řeší přes idečka a mapovací tabulky
|
||
Tori Profil |
kozusnikjan:
„Při zavolání funkce mi to vrátí "smazáno 0 řádků" .... žádná chyba“ Dotaz nic nesmaže v případě, že řádek s daným ID neexistuje v tabulce products_files - bez ohledu na to, že v dalších dvou tabulkách může být odpovídající řádek. Je to způsobené tím, že product_files máte jako hlavní tabulku dotazu a k ní připojujete další. Řešením je zajistit, že v hlavní tabulce vždy bude odpovídající řádek (ale mazat z ní nemusíte), např. pro řádky s ID = 9: delete t1, t2, t3 from (select 9 as id from dual) ref left join t1 on t1.id = ref.id left join t2 on t2.id = ref.id left join t3 on t3.id = ref.id |
||
kozusnikjan Profil * |
#7 · Zasláno: 22. 12. 2014, 11:48:33 · Upravil/a: kozusnikjan
tzn. že dotaz by měl vypadat takto: ?
$query = 'delete products_files t1, texts_files t2, galleries_files t3 from (select '.$id.' as id from dual) ref left join t1 on t1.id = ref.id left join t2 on t2.id = ref.id left join t3 on t3.id = ref.id'; protože takhle mi to nejede :/ |
||
_es Profil |
#8 · Zasláno: 22. 12. 2014, 11:59:36
kozusnikjan:
Asi si nepochopil dotaz o väzbách v tabuľkách. Ak tie väzby spravíš, tie spomínané „cudzie kľúče“, tak môžeš nastaviť aj kaskádové úpravy a kaskádové mazania. Teda napríklad zmažeš produkt z tabuliek produktov a automaticky sa odstránia záznamy v iných tabuľkách viazané na ten produkt. |
||
kozusnikjan Profil * |
#9 · Zasláno: 22. 12. 2014, 12:51:33
Vím co jsou vazby, ale asi jsem to špatně popsal. Nepoužívám žádné cizí klíče, vše funguje pouze na tom, že mám v db uloženo propojení ideček...
|
||
pcmanik Profil |
#10 · Zasláno: 22. 12. 2014, 12:57:41
kozusnikjan:
No tak to máš potom zlý návrh databázi. Ako jediné spravné riešenie je to ktoré napísal _es. A radím Vám dobre prerobte to ešte teraz ako neskôr keď s tým bude oveľa viac problémov. |
||
kozusnikjan Profil * |
#11 · Zasláno: 22. 12. 2014, 12:59:54
Návrh db je myslím si dobrý, jenom prostě nepoužívám cizí klíče....
|
||
_es Profil |
#12 · Zasláno: 22. 12. 2014, 18:44:28
kozusnikjan:
„Návrh db je myslím si dobrý, jenom prostě nepoužívám cizí klíče....“ A niečo ti snáď bráni ich použiť? |
||
kozusnikjan Profil * |
#13 · Zasláno: 22. 12. 2014, 23:13:47
Momentálně je mi každá minuta drahá a běží nám deadline na projekt, takže prioritou je to rozchodit a úpravy se mohou dělat potom, až to pojede aspoň v testovací verzi...
|
||
_es Profil |
kozusnikjan:
Naštudovanie aplikovania tých automatických kaskádových zmien v databázom serveri, ktorý používate (a neprezradíte), asi ani nemôže trvať dlhšie, než čas od založenia tohoto vlákna. |
||
tiso Profil |
#15 · Zasláno: 23. 12. 2014, 00:37:01
Rozdeľ to na 3 samostatné dotazy a keď budeš mať viac času, tak to prerob na cudzie kľúče.
|
||
kozusnikjan Profil * |
#16 · Zasláno: 23. 12. 2014, 12:03:25
_es:
V konečném důsledku asi nakonec máte pravdu... :D tiso: jojo, takhle to zatím mám Děkuji za rady :) |
||
Časová prodleva: 9 let
|
0