2010-11-04 12 views
8

Ich habe eine Tabelle mit vielen (> 20.000) Datensätzen. Es ist an der Zeit, diese etwas zu säubern, da Anfragen dazu führen, dass viele Ressourcen genutzt werden. Ich habe eine andere (temporäre) Tabelle mit einer letzten Datensätze. Alle Datensätze in der ersten Tabelle, die im zweiten nicht existieren, können gehen. Allerdings muss ich wegen einiger Joins die ID für die letzten Datensätze behalten, damit ich nicht einfach TRUNCATE und dann die Tabelle kopieren kann. Gibt es eine Möglichkeit, dies zu tun?Entfernen aller Datensätze aus einer Tabelle, die nicht in einer anderen Tabelle vorhanden sind

+0

Könnten Sie ein wenig verdeutlichen? Möchten Sie Einträge aus den Recent-Datensätzen oder aus der größeren Tabelle entfernen? – SilverSkin

+1

Beachten Sie, dass für eine Datenbank 20k Zeilen tatsächlich eine * kleine * Tabelle sind. Wenn Sie dort Leistungsprobleme haben, möchten Sie vielleicht einen Blick auf die Indizes der relevanten Tabellen werfen. – Piskvor

+0

Hallo, dies ist für einen ZenCart-Webshop, und jedes Mal, wenn die Seite geladen wird, versucht es viel zu wählen. –

Antwort

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

Edit:
id NOT IN (SELECT id FROM temp_table) ist eine lausige Konstruktion. Wenn Sie große Tabellen haben und Ihre Servereinstellungen auf wenig Speicher eingestellt sind, werden Sie dies für immer ausführen.

@Piskvor Die Antwort ist eine längere, aber eine viel bessere Abfrage, die am besten auf Low-Memory-Setups funktioniert. Und wenn ich "wenig Speicher" sage, meine ich Datenbankserver, die keinen vollen High-End-Computer aufnehmen, also so ziemlich jedes System, das eine kleine Unternehmenswebsite oder ähnliches verwaltet.

+0

Danke, das war sehr hilfreich. Ich möchte jedoch etwas für zukünftige Referenz hinzufügen: Sie sollten ID mit Ihrem einzigartigen Wert ersetzen. Für mich war es der Artikelname, da die Record IDs in den beiden Tabellen nicht übereinstimmten. –

4

Dies gibt Ihnen die id s die Zeilen, die nicht über eine entsprechende Zeile haben (durch recordid Spalt angepasst - Ich kann anders sein) in der anderen Tabelle:

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

, dass Sie das überprüfen kann Sie wählen tatsächlich die richtigen Zeilen zum Löschen aus. Dann stecken Sie es in ein LÖSCHEN:

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 
) 
Verwandte Themen