2010-12-10 2 views
0

Ich richte einen Uploader (mit PHP) für meinen Kunden ein, wo sie eine CSV (in einem vorher festgelegten Format) auf ihrem Rechner zum Hochladen auswählen können. Die CSV wird wahrscheinlich 4000 bis 5000 Zeilen haben. PHP verarbeitet die Datei, indem jede Zeile der CSV gelesen und direkt in die DB-Tabelle eingefügt wird. Dieser Teil ist einfach.Möglich, eine gemischte überschreiben/anfügen Batch-Schreiben in MySQL?

Im Idealfall würde ich jedoch, bevor ich diese Daten an die Datenbanktabelle anfüge, 3 der Spalten (A, B und C) überprüfen und prüfen, ob ich bereits eine passende Kombination dieser 3 Felder in habe Die Tabelle UND WENN SO würde ich lieber diese Zeile aktualisieren als anzuhängen. Wenn ich keine passende Kombination dieser 3 Spalten habe, möchte ich fortfahren und die Zeile einfügen, indem ich die Daten an die Tabelle anfüge.

Mein erster Gedanke ist, dass ich die Spalten A, B und C zu einem eindeutigen Index in meiner Tabelle machen und dann einfach jede Zeile einfügen konnte, ein 'gescheitertes' INSERT (aufgrund der Beschränkung meines eindeutigen Index) irgendwie und dann mache das Update. Scheint, dass diese Methode effizienter sein könnte als eine separate SELECT-Abfrage für jede Zeile zu machen, nur um zu sehen, ob ich bereits eine passende Kombination in meiner Tabelle habe. Ein dritter Ansatz kann sein, einfach ALLES anzuhängen, keinen eindeutigen MySQL-Index zu verwenden und dann nur die neueste eindeutige Kombination zu erfassen, wenn der Client später diese Tabelle abfragt. Ich versuche jedoch, eine Menge nutzloser Daten in dieser Tabelle zu vermeiden.

Gedanken zu Best Practices oder cleveren Ansätzen?

Antwort

1

Wenn Sie machen die 3 Spalten die un Ique ID, können Sie eine INSERT mit ON DUPLICATE KEY tun.

INSERT INTO table (a,b,c,d,e,f) VALUES (1,2,3,5,6,7) 
    ON DUPLICATE KEY UPDATE d=5,e=6,f=7; 

Sie können in der MySQL manual mehr über diese handliche Technik hier lesen.

+0

sehr handliche Technik. – phirschybar

+0

Ich bin froh, dass ich helfen konnte. Dies ist ein handlicher Trick, den ich aufgeschnappt habe. –

1

Wenn Sie einen eindeutigen Index für das (A, B, C) Spalten hinzufügen, dann können Sie REPLACE verwenden, um dies in einer Erklärung zu tun:

Werke REPLACE genau wie INSERT, außer dass, wenn ein alte Zeile in der Tabelle den gleichen Wert wie eine neue Zeile für einen Primärschlüssel oder einen eindeutigen Index hat, die alte Zeile gelöscht wird, bevor die neue Zeile eingeführt wird ...

+0

Dies funktioniert genauso gut wie mit ON DUPLICATE. Vielen Dank. – phirschybar