Autor Zpráva
kozusnikjan
Profil *
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
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 *
Žá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
kozusnikjan:
A existují tedy nějaké vazby mezi samotnými tabulkami?
kozusnikjan
Profil *
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 *
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
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 *
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
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 *
Návrh db je myslím si dobrý, jenom prostě nepoužívám cizí klíče....
_es
Profil
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 *
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
Rozdeľ to na 3 samostatné dotazy a keď budeš mať viac času, tak to prerob na cudzie kľúče.
kozusnikjan
Profil *
_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 :)

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: