2010-07-05 11 views
7

Was Völker Gedanken über die meisten Leistung effizient sind die folgende Abfrage zu tun:MySQL 'UPDATE ON DUPLICATE KEY' ohne eine eindeutige Spalte?

  • 3 Säulentisch

  • wenn die Kombination aus col_1 und col_2 bereits Werte vorhanden sind UPDATE col_3

  • sonst INSERT neue Reihe

Ich nehme an, ich brauche eine Art, wenn UPDATE ON DUPLICATE KEY (die ich noch nie zuvor verwendet habe), aber ich habe kein 'KEY', sondern ein Paar von zwei Werten (Spalten), um einen Schlüssel ...

Antwort

15

Sie können einen Schlüssel PRIMARY oder UNIQUE aus mehreren Spalten erstellen (Composite-Schlüssel genannt) in MySQL, die ON DUPLICATE KEY funktionieren gut funktionieren.

// create a composite index 
CREATE INDEX my_composite_index ON my_table (column1, column2); 

// insert or update 
INSERT INTO my_table (column1, column2) VALUES ('value1', 'value2') ON DUPLICATE KEY UPDATE column3=column3+1; 
+0

danke ceejayoz, können Sie mir bitte einen Beispielcode für ON DUPLICATE KEY geben? – Haroldo

+0

@Haroldo Fertig, siehe Bearbeiten. – ceejayoz

+0

genial, wirklich nett von dir - vielen Dank! Ich sollte schnell überprüfen - ich muss nur den Index einmal richtig erstellen? – Haroldo

1

Am effizientesten ist es, einen eindeutigen Schlüssel zu erstellen und ON DUPLICATE KEY UPDATE zu verwenden.

Langsamer Weg ist:
LOCK TABLE
SELECT TABLE (Sie einen Index ohnehin für die beste Leistung benötigen)
falls vorhanden, AKTUALISIEREN
sonst INSERT
UNLOCK TABLES

-1

Edit: Ignorieren meine Vorschläge

Sie können einen zusammengesetzten Schlüssel verwenden, wie ceejayoz sagte, aber ich denke, dass Sie REPLACE INTO statt UPDATE ON DU benötigen PLICATE KEY, da REPLACE auch eingefügt wird, wenn kein Duplikat gefunden wird.

Hinweis: Ich kenne die Funktionsweise von UPDATE ON DUPLICATE KEY nicht, aber es klingt, als würde es keine Einfügungen ausführen.

+3

'ON DUPLICATE KEY UPDATE 'ist eigentlich nur für' INSERT'-Abfragen. http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html 'REPLACE INTO' ist eine schlechte Wahl, weil es Ihnen nicht erlaubt, nur ein oder zwei Felder zu aktualisieren - Sie haben um Werte für die gesamte Zeile anzugeben. – ceejayoz

+0

Mein schlecht, danke für den Kommentar –

Verwandte Themen