CSV Import - Dubletten vermeiden? (mysql/phpmyadmin)

Mike-Fu-RLP

Benutzer
Beiträge
6
Hallo Foris,


ich würde gerne mein wachsendes Datengrab aus diversen CSVs endlich in eine regelmäßige und besser pflegbare DB übersiedeln.


Darunter sind CSV Dateien von der FritzBox, Handy-Anrufliste, diverse Zeiterfassungen etc.

Da die Datenerfassung auf den Geräten fortlaufen ist habe ich das Problem, dass die dort exportierebaren Daten oft schon vorhandene Datensätze doppeln würden.


Daher wäre meine erste Frage, wie kann ich zwar immer eine gesamtDaten.CSV importieren, dabei aber vermeiden, dass bestehende Daten entweder überschrieben werden (Update) oder dann eine Zeile mit Bearbeitungsvermerk und eine identische ohne diesen entsteht?


Leider generieren die Exporte keinen eindeutigen einmaligen Schlüssel oder PK den ich verwenden könnte, es müsste also eine Prüfung aller Felder stattfinden.


Hat hier jemand für mich einen Ratschlag dazu?


Danke schon vorab.

Grüße


Mike
 
Werbung:
... bzw soweit ich sehe sollte das mit IGNORE und UNIQUE gehen, die habe ich aber noch nie bisher genutzt.
und bin mir nicht sicher wie ich das dann innerhalb von phpmyadmin machen würde...
 
.. bzw soweit ich sehe sollte das mit IGNORE und UNIQUE gehen, die habe ich aber noch nie bisher genutzt.
und bin mir nicht sicher wie ich das dann innerhalb von phpmyadmin machen würde...

Dann ist es halt das erste Mal, daß Du das benutzt. Wo ist das Problem? Das hat übrigens auch nichts mit PMA zu tun, das ist lediglich ein dummer Client für eine dumme Datenbank.
 
Dann ist es halt das erste Mal, daß Du das benutzt. Wo ist das Problem? Das hat übrigens auch nichts mit PMA zu tun, das ist lediglich ein dummer Client für eine dumme Datenbank.

Danke das ist eine der typischen schnellen Antworten ohne nennenswerten oder brauchbaren Inhalt.
Auch eine Option den Counter hochzujagen und den Guru-Status zu erlangen :-X

Also ich bin mehr Noop als Du.
Ich kenne mich minimal damit aus was ich vorhabe und mache.

Wenn ich in ein Forum eine Frage stelle, dann wäre eine für mich hilfreiche und zielführende Antwort etwas anderes und ausführlicheres gewesen.

Mit ist bewusst und bekannt das phpmyadmin ein INterface ist mitdem ich auf (m)eine Datenbank zugreife.
Meine Frage dabei ist dann eher, (WIE) kann ich in mit den Funktionen IGNORE und UNIQUE einen Import einer CSV mittels phpmyadmin realisieren um doppelte Importe zu vermeiden.

Im Idealfall hätte ich vllt damit gerechnet dass wir meine Rohdatenformate betrachten und herausfinden welche Felder ich dazu nutzen kann um Unique zu sein.
Meine bisheige Denke wäre zumindest dass ich die Zeit/Datum Felder und die Textfelder als Unique nutzen will. Nur dass ich davon bisher halt absolut keine Ahnung habe ausser dass ich in Google gefunden habe dass es das wohl gibt.

Die Hoffnung wäre also eine entwas strukturierete Hilfe zur Selbsthilfe um entnervendes blindes austesten zu vermeiden.

Dennoch danke für deinen Beitrag :)
 
es ist oft sinnvoll, solche CSV-Dateien erst einmal in eine Zwischentabelle einzulesen (dazu haben die Datenbanken unterschiedliche Werkzeuge) und von da aus dann mit SQL in die eigentliche Zieltabelle zu schaffen.

Mal angenommen:

Code:
test=# create table ziel(id int primary key, val int);
CREATE TABLE
test=# create table source(id int primary key, val int);
CREATE TABLE
test=# insert into source values (1, 10);
INSERT 0 1
test=# insert into source values (2, 20);
INSERT 0 1

Um eine CSV in eine Tabelle zu bringen gibt es natürlich in PostgreSQL den COPY-Befehl, in MySQL ist das wohl LOAD.

Nun alle Records von source nach ziel, dabei sollen, falls vorhanden, die Val's geupdated werden:

Code:
test=# with move as (delete from source returning *) insert into ziel select * from move on conflict (id) do update set val = excluded.val;
INSERT 0 2
test=# select * from ziel;
 id | val
----+-----
  1 |  10
  2 |  20
(2 rows)

test=# select * from source ;
 id | val
----+-----
(0 rows)

test=#

Wir hatten ja noch keine drin, daher hat es alle direkt übernommen. Unsere source-Tabelle ist außerdem nun leer. Nun noch mal:

Code:
test=# insert into source values (2, 22);
INSERT 0 1
test=# insert into source values (3, 302);
INSERT 0 1
test=# with move as (delete from source returning *) insert into ziel select * from move on conflict (id) do update set val = excluded.val;
INSERT 0 2
test=# select * from ziel;
 id | val
----+-----
  1 |  10
  2 |  22
  3 | 302
(3 rows)

Den mit id=2 hat es also auf den neuen Wert geupdated, den mit id=3 neu dazugenommen.

Achtung: ich verwende PostgreSQL. Bei MySQL ist die Syntax anders bzw. es kann viele Dinge auch nicht. Dumme DB, siehe erste Antwort.
 
Werbung:
Mal ein ganz anderer Ansatz:
Um erstmal eine Grund-Liste zu haben... warum stellst du deine vorhandenen Listen nicht mittels SVERWEIS (Libre oder OpenOffice) gegenüber?
Da bruchst du erstmal garnichts mit Datenbank-Befehlen machen!
 
Zurück
Oben