2017-05-09 1 views
0

Ich habe eine Website, die Uploads von CSV-Dateien behandelt und fügt sie in die DB. Die CSV-Vorlagen sind 229 Felder mit mehreren Zeilen pro Datei. Da es mehrere Zeilen gibt, kann es vorkommen, dass zwei CSV-Dateien einen Datensatz aus einer vorherigen Datei enthalten und Duplikate vermieden werden sollen.SQL vermeiden doppelte eingefügt in staging/temporäre Tabelle

Ich habe die CSV-Dateien derzeit in eine 230-Feld-Staging-Tabelle hochgeladen (ein Feld mehr als die CSV für einen automatisch inkrementierenden Primärschlüssel) und dann in kleinere Tabellen aufgeteilt.

Mein Problem: Wenn die CSV hochgeladen wird, möchte ich alle Datensätze, die bereits existieren zu überschreiben oder zu ignorieren, so dass ich nur einen der 229 Feld Datensatz haben.

Gibt es eine Möglichkeit, dies nur auf der Staging-Tabelle zu tun, so muss ich nicht um die kleineren Tabellen kümmern?

+1

Haben Sie haben die Syntax [auf dem doppelten Schlüssel] (https://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html) gelesen? Wenn ich mich nicht irre, suchen Sie danach? – Burki

Antwort

1

Wenn alle zuvor importierten Datensätze in der temporären Tabelle sind, könnten Sie etwas wie folgt verwenden:

select * 
from `table` 
group by Col1, Col2, Col3 [,...] 
having count(*) = 1 
order by id asc; 

Grundsätzlich alle Datensätze auswählen, dann die Gruppe sie durch jede Spalte, die Sie unterschiedliche wollen, dass sie, und filtere das Ergebnis nach der Gruppenzahl (wobei die Gruppenzahl> 1 ein Vielfaches der gleichen Datensätze ist). Danach müssen Sie nur die neu hinzugefügten Datensätze herausfiltern.

Denken Sie jedoch daran, dass Dubletten in der gleichen CSV-Datei vorkommen können, wenn sie mit dieser Methode übersprungen werden. Wenn dies der Fall ist, können Sie distinct first für Ihr Dataset verwenden.

+0

Ich denke, dass ich ursprünglich zuerst auf distinct gelehnt war, nur weil es so viele Felder gibt. Es ist seltsam, aber diese CSV-Dateien haben alle mehrere Zeilen mit jeweils 229 Feldern. Aus Gründen der Einfachheit habe ich jeden in eine 230-Feld-Staging-Tabelle importieren und dann auf kleinere zerlegen. Da wir gerade mit einer CSV testen, füllt es sich bei jedem Upload immer wieder auf und wir müssen es abschneiden. Könnte ich distinct zuerst so verwenden, dass mehrere Felder geprüft werden? Sind Arbeitsnummer, Seriennummer, Kontonummer und Datum identisch? –

+0

@TomN. Das distinct wendet nur die in der Ergebnismenge vorhandenen Felder an. Wenn Sie also nach allen Spalten unterscheiden wollen, müssen Sie 'select distinct *' verwenden und wenn Sie nur durch ein paar Felder unterscheiden wollen, verwenden Sie 'select distinct field1, field2, file3 [, ...]'. – Derenir

0

Laden Sie zunächst Daten aus der Datei in eine temp_table und dann eine Abfrage

SELECT * FROM temp_table INTO target_table 
WHERE temp_table.value NOT IN (SELECT value FROM target_table) 

Hier läuft temp_table.value ist der Wert, mit dem Sie festlegen, ob die Zeilen, die Sie bereits kopiert existieren in einer target_table

Verwandte Themen