Autor | Zpráva | ||
---|---|---|---|
Jozin Profil |
#1 · Zasláno: 15. 6. 2011, 22:00:10
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 * |
#2 · Zasláno: 15. 6. 2011, 22:07:31
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 |
#3 · Zasláno: 15. 6. 2011, 22:11:23
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 |
#4 · Zasláno: 15. 6. 2011, 22:16:36
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 |
#5 · Zasláno: 15. 6. 2011, 22:18:10
TomášK:
To vypadá jako o hodně lehčí způsob díky za nakopnutí mrknu na to |
||
Jozin Profil |
#6 · Zasláno: 15. 6. 2011, 22:36:03 · Upravil/a: Jozin
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 |
#7 · Zasláno: 15. 6. 2011, 23:09:41
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 |
||
Jozin Profil |
#8 · Zasláno: 15. 6. 2011, 23:14:19
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 :)
|
||
Časová prodleva: 13 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0