doppelte Datensätze beim INSERT ignorieren

MySQL, PostgreSQL, SQLite
andreasbinder
Posts: 28
Joined: 2003-09-29 11:59

doppelte Datensätze beim INSERT ignorieren

Post by andreasbinder » 2004-02-17 16:38

Hi,

ich habe eine Datenbank mit folgendem Format:

ID(auto_increment)|Name|Anschrift|PLZ|Zusatz

Zum Füllen der Datenbank benutze ich ein PHP Skript, das vorhanden Dateien ausliest, die Daten aufbereitet und dann in die DB schreibt.

Da sich der Inhalt (die Datensätze) der Dateien teilweise überscheiden, kann es sein, dass die selben Daten mehrfach eingefügt werden.

Gibt es eine Möglichkeit zu prüfen, ob ein Datensatz (eindeutig nach Kombination aus Name, Anschrift, PLZ, Zusatz) bereits vorhanden ist und dann der Datensatz nicht wieder eingefügt wird?

Diese sollte möglichst nicht im PHP Skript über ein "SELECT ..." erfolgen.

Vielen Dank.

AndyB

cjhbabel
Posts: 63
Joined: 2002-07-18 12:09

Re: doppelte Datensätze beim INSERT ignorieren

Post by cjhbabel » 2004-02-17 16:48

AndreasBinder wrote:ID(auto_increment)|Name|Anschrift|PLZ|Zusatz
Die Daten Name, Anschrift & PLZ um Leerzeichen und andere Satzzeichen bereinigt und alles kleingeschrieben in die MD5 Funktion packen und dann die MD5 für jede Adresse mitspeichern. Das Feld MD5 muss unique sein. Damit erreichst Du, dass jeder Datensatz bei dem Name, Anschrift und PLZ gleich ist nur 1x in der Datenbank ist.

andreasbinder
Posts: 28
Joined: 2003-09-29 11:59

Re: doppelte Datensätze beim INSERT ignorieren

Post by andreasbinder » 2004-02-17 16:57

Vielen Dank für Deine Antwort.
Gute Idee!

Gibt es noch eine schnellere Möglichkeit, ohne die Verschlüsseln mit md5(), da ein schnelles Einlesen sehr wchtig ist (zeitkritisch).

AndyB

outofbound
Posts: 470
Joined: 2002-05-14 13:02
Location: Karlsruhe City

Re: doppelte Datensätze beim INSERT ignorieren

Post by outofbound » 2004-02-17 18:27

Einen Unique Index drüber legen?

*SQL rat*

Andererseits:

Was willst du genau machen, warum, und geht es nicht auch anders?
(z.B. mit replace ?)

Gruss,

Out

andreasbinder
Posts: 28
Joined: 2003-09-29 11:59

Re: doppelte Datensätze beim INSERT ignorieren

Post by andreasbinder » 2004-02-17 19:18

Mein Problem liegt darin, dass die Kombination aus den 3 Spalten Name, Anschrift und Zusatz das eindeutige Kriterium ergeben und damit berücksichtigt werden müssen. Außerdem ist die ID auto_increment.

AndyB

php-tom
Posts: 35
Joined: 2002-06-28 16:48

Re: doppelte Datensätze beim INSERT ignorieren

Post by php-tom » 2004-02-17 19:42

AndreasBinder wrote:Mein Problem liegt darin, dass die Kombination aus den 3 Spalten Name, Anschrift und Zusatz das eindeutige Kriterium ergeben und damit berücksichtigt werden müssen. Außerdem ist die ID auto_increment.
Dann erzeuge doch einen zusammengesetzten, eindeutigen Index über die betreffenden Spalten. Geht ganz einfach mit phpMyAdmin.
Wird als ein einziger Index angelegt und betrifft die o.g. 3 Spalten.
Habe ich für ein Projekt mal gemacht und funktioniert einwandfrei!

Gruss,
Thomas

andreasbinder
Posts: 28
Joined: 2003-09-29 11:59

Re: doppelte Datensätze beim INSERT ignorieren

Post by andreasbinder » 2004-02-17 20:09

Danke.

127.0.0.1
Posts: 38
Joined: 2002-08-15 10:53
Location: Hamburg

Re: doppelte Datensätze beim INSERT ignorieren

Post by 127.0.0.1 » 2004-02-17 22:22

Guck mal, ob ein DISTINCT auch bei MySQL funzt (ich kenns nur bei SAPDB) und obs auch beim insert funzt

gruß, Loopback

outofbound
Posts: 470
Joined: 2002-05-14 13:02
Location: Karlsruhe City

Re...

Post by outofbound » 2004-02-18 12:03

So, euch widme ich meinen 300sten ;)

Das kommt ganz auf die SQL version an, deswegen auch *sql rat*.

Grundsätzlich sollte ein Index über die drei Spalten jedoch tadellos funktionieren, und
das ganze auch entsprechend schnell machen, da du ja wahrscheinlich auch in dieser
Form auf die Daten zugreifen willst.

Leider kann man dazu nichts sagen, da die Datenmenge, das Datenmodell und auch
die Verwendungszwecke der Daten nicht gegeben sind.

Die Frage ist, warum muss das einlesen schnell funktionieren?

Vielleicht würden auch Transaktionen helfen?

Fragen über Fragen ;)

Gruss,

Out