Hallo,
ich steh vor einem großen Problem: Ich habe eine CSV-Datei mit ca. 20.000 Zeilen. Eine Spalte einer Zeile beinhaltet immer eine E-Mail-Adresse.
In der Datenbank hab ich ebenso ein Feld mit der E-Mail-Adresse, hier liegt auch ein Index drauf.
Mein Vorhaben: Den Wert eines bestimmten Feldes update für den Datensatz mit der E-Mail, die in der CSV-Datei vorkommt. Beispiel:
in der CSV-Datei ist die E-Mail test@test.de vorhanden. In der Datenbank muss ich nun für diese E-Mail den Wert setzen. Der Wert den ich setze, ist immer der gleiche. Nur wie kann ich das am performantesten machen?
Möglichkeit 1 bricht bei mir immer ab mit einem Browser(!)-Fehler:
ich habe alle Emails der CSV-Datei in ein Array gelesen und geh in einer Schleife über alle Datensätze in der DB, die in Frage kommen für ein Update (sind aber leider immer noch ca 91.000).
mit array_key_exists prüfe ich, ob die Email im array vorhanden ist (email ist schlüssel im array) und führe dann das update durch. Hierfür nutze ich auch schon prepared Statements.
WIe gesagt, dauert das aber zu lange und bricht irgendwann ab. Momentan kann ich grad mal 100 Datensätze updaten.
Das Problem ist nämlich. dass ich jede E-Mail nur einmal updaten darf. Beispiel: die E-Mail test@test.de ist 5x in der Datenbank vorhanden, der erste Eintrag darf nur ein Update erhalten.
Wie kann ich das am geschicktesten lösen?
Ich hatte gedacht, ich packe alle Emails in einen String, kommagetrennt, den ich beim Update dann in der Where-Klausel mitgeben über "IN (emails...)". Aber 20.000 emails im where geht nicht gut oder? außerdem werden dann alle datensätze geupdatet...
Ich bin ratlos :-(