Autor Zpráva
Jozin
Profil
Zdravím, doufám, že se to tu ještě neřešilo. Mám problém s multiple delete.

Asi nějak nechpu, jak se to dělá...

mám několik tabulek s cizím klíčem:
osoby, kde je id
vztahy, kde je id_osoby1 a id_osoby2 obojí FK na id_osoby
osoby_schuzky, kde je id_osoby jako FK a takto to pokračuje.

Chci smazat uživatele, ale je nutné prvně smazat všechny záznamy obsahující id_osoby, kterou chci smazat. Primitivní způsob je kolik je tabulek, tolik bude dotazů na smazání. Další je použít ten multiple delete, ale jak?

Můj pokus o dotaz:
DELETE osoby, adresy, kontakty, vztahy, osoby_schuzky
FROM osoby inner join adresy inner join kontakty inner join vztahy inner join osoby_schuzky
WHERE osoby.id_osoby='13'


to mi ale píše chybu kvůli tabulce vztahů. Jestli máte nápad, tak vám budu vděčný.
Kajman_
Profil *
Spíše to bude takto nějak...
DELETE FROM osoby, adresy, kontakty, vztahy, osoby_schuzky
USING osoby 
inner join adresy  on VAZEBNI_PODMINKA 
inner join kontakty on VAZEBNI_PODMINKA  
inner join vztahy on VAZEBNI_PODMINKA  
inner join osoby_schuzky on VAZEBNI_PODMINKA  
WHERE osoby.id_osoby='13'

Ale smaže to jen záznamy, kde bude vždy alespoň jeden příslušný v každé z tabulek.
TomášK
Profil
Pravděpodobně se snažíte ručně implementovat ON DELETE CASCADE, což je nejjednodušší způsob, jak docílit smazání záznamů patřících k osobě. Viz dokumentace nebo nedávné vlákno
Jozin
Profil
Kajman:
Děkuji za pomoc, ale ještě stále to nefunguje. Můžeš se prosím podívat, kde mám chybu? Ona by to neměla být chyba. Příkaz se provede, ale osobu s id 13 nesmaže a ani jiný záznam v ostatních tabulkách. A to, že se smažou jen ty, co mají jsem očekával.

Toto jsem zkoušel:
DELETE FROM osoby, adresy, kontakty, vztahy, osoby_schuzky
USING osoby 
inner join adresy  on adresy.id_adresy=osoby.id_adresy 
inner join kontakty on kontakty.id_osoby=osoby.id_osoby
inner join vztahy on (vztahy.id_osoby1=osoby.id_osoby or vztahy.id_osoby2=osoby.id_osoby)
inner join osoby_schuzky on osoby_schuzky.id_osoby=osoby.id_osoby
WHERE osoby.id_osoby='13'
Jozin
Profil
TomášK:
To vypadá jako o hodně lehčí způsob díky za nakopnutí mrknu na to
Jozin
Profil
TomášK:
Tak jsem to asi nepochopil. Nějak mi to nejde. Furt to hlásí chybnou syntax. Jak to mám zapsat prosím?

EDIT: Zkoušel jsem to takto
foreign key id_osoby references osoby on delete cascade where id_osoby='13'
TomášK
Profil
Viz odkazované vlákno, není to samostatný příkaz, ani součást příkazu DELETE, ale součást definice tabulky. Je třeba zadat to už při vytváření tabulky (CREATE TABLE), nebo doplnit pomocí ALTER TABLE. Dotaz pak bude jen
DELETE FROM osoby WHERE id = 13
a ono to smaže všechny přidružené záznamy.
Jozin
Profil
Jej děkuji za pomoc. Nakonec jsem pochopil, že jsem měl nastavit mazání v kaskádě... FK jsem tam už měl, ale neměl jsem metodu při mazání či úpravě... Trvalo mi to celkem dlouho, protože už jsem hodně unavenej řeším ty databáze celej den. Ještě jednou díky za pomoc :)
Toto téma je uzamčeno. Odpověď nelze zaslat.

0