2010-11-04 11 views
8

Mam tabelę z wieloma (> 20 000) rekordami. Czas trochę je posprzątać, ponieważ pytania zaczynają się na wiele regresów. Mam inny (tymczasowy) tabelę z rekordami ostatnich. Wszystkie rekordy w pierwszej tabeli, które nie istnieją w drugiej, mogą przejść. Muszę jednak zachować identyfikatory dla ostatnich rekordów z powodu niektórych złączeń, więc nie mogę po prostu PRZETRWAĆ, a następnie skopiować tabelę. Czy jest jakiś sposób, aby to zrobić?Usuwanie wszystkich rekordów z tabeli, która nie istnieje w innej tabeli

+0

Czy mógłbyś trochę wyjaśnić? Czy chcesz usunąć wpisy z ostatnich rekordów lub z większej tabeli? – SilverSkin

+1

Należy zauważyć, że w przypadku bazy danych 20k wierszy jest w rzeczywistości * małą * tabelą. Jeśli masz problemy z wydajnością, możesz chcieć profilować i patrzeć na odpowiednie indeksy tabel. – Piskvor

+0

Witam, to jest dla sklepu internetowego ZenCart i za każdym razem, gdy strona jest ładowana, próbuje WYBRAĆ dużo. –

Odpowiedz

14
DELETE FROM old_table WHERE id NOT IN (SELECT id FROM temp_table) 

Edit:
id NOT IN (SELECT id FROM temp_table) jest kiepska konstrukcja. Jeśli masz duże tabele, a twoje ustawienia serwera są dostrojone do niskiej ilości pamięci, uruchomisz to na zawsze.

@Piskvor Odpowiedź jest dłuższa, ale o wiele lepsza, która będzie działać najlepiej w przypadku konfiguracji z małą pamięcią. A kiedy mówię "low memory", mam na myśli serwery baz danych, które nie zajmują pełnego komputera klasy high-end, a więc prawie każdy system, który zarządza małą witryną biznesową lub podobnymi rzeczami.

+0

Dziękuję, to było bardzo pomocne. Chciałbym jednak dodać coś na przyszłość: powinieneś zastąpić 'id' swoją unikalną wartością. Dla mnie była to nazwa artykułu, ponieważ identyfikator rekordu nie pasował do dwóch tabel. –

4

To daje id s wierszy, które nie mają odpowiedniego wiersza (dopasowane recordid kolumnie - twój może być inna) w drugiej tabeli:

SELECT t1.id 
    FROM firsttable t1 
    LEFT JOIN secondtable t2 
WHERE t1.recordid = t2.recordid 
    AND t2.id IS NULL 

, która pozwala na sprawdzenie, faktycznie wybierasz właściwe wiersze do usunięcia. Następnie podłącz go do DELETE:

DELETE FROM firsttable WHERE firsttable.id IN (
    SELECT t1.id 
     FROM firsttable t1 
     LEFT JOIN secondtable t2 
    WHERE t1.recordid = t2.recordid 
     AND t2.id IS NULL 
) 
Powiązane problemy