Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sql] usuwanie z tabeli
Forum PHP.pl > Forum > Bazy danych
DeyV
To chyba prosty problem, ale coś nie wiem, jak to zrobić...
Jak stworzyć zapytanie, umożliwiajace usunięcie wszyskich wpisów z tabeli, dla których nie istnieje rodzic, tj. został usuniety?
Na zasadzie zwiazku:
tabela potomków: id, id_rodzica, dane...
tabela rodziców: id, dane...
HaRy
jednym zapytankiem chyba nie mozna tego zrobic
Jabol
a może coś takiego
Kod
DELETE FROM dzieci WHERE id_rodzica NOT IN (SELECT id FROM rodzice)
Tylko to nie bedzue działać na niektórych db
DeyV
To by było za proste.
I chyba jescze nie ma wersji MySQL, która by to obsłużyła. Myślcie ludzie dalej smile.gif
Jabol
to czemu nie mówisz, że to do mysql'a?
uboottd
Dwa rozwiazania MySQLowe:

1. Przejdz na tabele InnoDB i zdefiniuj normalne klucze obce i ustaw ON DELETE CASCADE wtedy przy usuwaniu rodzica dzieci zostana usuniete automatycznie.

2. Mysle ze da sie to zrobic multitable deletem, ale nie pamietam w tej chwili skladni i ograniczen, wiec nie podam przykladu.
dragossani
Może zaliasować tabelę i zrobić left-join dzieci->rodzice. Jeśli rodzic IS NULL to rekord do kasacji. Nie wiem tylko czy DELETE z MySQL to udźwignie.
DeyV
W manulau znalazłem taką konstrukcję:
Cytat
DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id
or
DELETE FROM t1,t2 USING t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id


Niestety, nie udało mi się tego uruchomić.
tabela rodziców: kategorie[id, ...]
tabela dzieci: produkty[id, kat, ...]
Zapytanie:
Cytat
DELETE FROM produkty
USING produkty, kategorie
WHERE kategorie.id = produkty.kat
and kategorie.id IS NULL
jest co prawda poprawne, ale usuwa 0 rekordów, choć zapytanie typu:
Cytat
SELECT produkty. * , kategorie. *
FROM produkty
LEFT JOIN kategorie
ON kategorie.id = produkty.kat
WHERE kategorie.id IS NULL

wyświetla wszystkie potrzebne rekordy.

Akcja dzieje się na MySQL 4.0.x
Jak to ugryść?
uboottd
Cytat
Zapytanie:
Cytat
DELETE FROM produkty
USING produkty, kategorie
WHERE kategorie.id = produkty.kat
and kategorie.id IS NULL
jest co prawda poprawne, ale usuwa 0 rekordów, choć zapytanie typu:
Cytat
SELECT produkty. * , kategorie. *
FROM produkty
LEFT JOIN kategorie
ON kategorie.id = produkty.kat
WHERE kategorie.id IS NULL

wyświetla wszystkie potrzebne rekordy.



Odpowiedz jest prosta - to NIE SA takie same zapytania. W pierwszym przypadku wybierasz te wiersze ktore MAJA swoje odpowiedniki w drugiej tabeli, po czym usilujesz skasowac te ktore nie maja idkow, a przy takim warunku one oczywiscie odpadna w przedbiegach winksmiley.jpg. Natomiast w drugim wybierasz WSZYSTKIE wiersze z pierwszej tabeli, po czym doklejasz ewentualne wiersze z drugiej - i tu moga sie pojawic juz nule w drugiej tabeli.

A rozwiazanie zadania jest takie:

Cytat
DELETE FROM produkty
USING produkty LEFT JOIN kategorie ON produkty.kat = kategorie.id
WHERE kategorie.id IS NULL
DeyV
Dzięki. Próbowałem juz tyle kombinacji, że do tego już nie dotarłem.
Bo co prawda wiedziałem, zę to nie jest dokładnie to samo, ale nie miałem już pomysłu, jak podpiąć pod to zapytanie JOIN.
Jeszcze raz Th'x
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.