[sql] usuwanie z tabeli |
[sql] usuwanie z tabeli |
13.05.2003, 09:52:34
Post
#1
|
|
Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław |
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... -------------------- "Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
|
|
|
13.05.2003, 19:00:44
Post
#2
|
|
Grupa: Zarejestrowani Postów: 152 Pomógł: 0 Dołączył: 15.05.2002 Skąd: Łódź Ostrzeżenie: (0%) |
jednym zapytankiem chyba nie mozna tego zrobic
|
|
|
13.05.2003, 19:32:04
Post
#3
|
|
Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) |
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
|
|
|
13.05.2003, 20:04:26
Post
#4
|
|
Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław |
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 -------------------- "Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
|
|
|
13.05.2003, 20:21:00
Post
#5
|
|
Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) |
to czemu nie mówisz, że to do mysql'a?
|
|
|
15.05.2003, 10:09:56
Post
#6
|
|
Grupa: Zarejestrowani Postów: 384 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Chorzow Ostrzeżenie: (0%) |
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. |
|
|
15.05.2003, 13:24:00
Post
#7
|
|
Grupa: Przyjaciele php.pl Postów: 398 Pomógł: 0 Dołączył: -- Skąd: Poznań Ostrzeżenie: (0%) |
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.
-------------------- cease this long, long rest / wake and risk a foul weakness to live / when it all comes down / watch the smoke and bury the past again / sit and think what will come / raise your fears and cast them all away
|
|
|
15.05.2003, 15:23:54
Post
#8
|
|
Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław |
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
jest co prawda poprawne, ale usuwa 0 rekordów, choć zapytanie typu: USING produkty, kategorie WHERE kategorie.id = produkty.kat and kategorie.id IS NULL 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ść? -------------------- "Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
|
|
|
22.05.2003, 10:10:44
Post
#9
|
|
Grupa: Zarejestrowani Postów: 384 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Chorzow Ostrzeżenie: (0%) |
Cytat Zapytanie:
Cytat DELETE FROM produkty
jest co prawda poprawne, ale usuwa 0 rekordów, choć zapytanie typu: USING produkty, kategorie WHERE kategorie.id = produkty.kat and kategorie.id IS NULL 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 . 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 |
|
|
22.05.2003, 14:17:07
Post
#10
|
|
Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław |
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 -------------------- "Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
|
|
|
Wersja Lo-Fi | Aktualny czas: 27.04.2024 - 13:08 |