2010-06-09 7 views
14

Ich schreibe eine Anwendung und ich benutze MySQL als DBMS, wir laden Immobilienangebote herunter und es gab einige Leistungsprobleme. Die alte Architektur sah so aus: Eine Eigenschaft wird aktualisiert. Wenn die Anzahl der betroffenen Zeilen nicht 1 ist, wird das Update nicht als erfolgreich angesehen, andernfalls löst die Aktualisierungsabfrage unser Problem. Wenn das Update nicht erfolgreich war und die Anzahl der betroffenen Zeilen mehr als 1 ist, haben wir Duplikate und wir löschen alle. Nachdem wir die Duplikate bei Bedarf gelöscht haben, wenn das Update nicht erfolgreich war, erfolgt eine Einfügung. Diese Architektur funktionierte gut, aber es gab einige Geschwindigkeitsprobleme, da Eigenschaften gelöscht wurden, wenn sie 15 Tage lang nicht aktualisiert wurden. Theoretisch ist das Hauptproblem das Löschen von Eigenschaften, weil einige Eigenschaften für Monate am Leben sind und die Indizes sehr weit voneinander entfernt sind (wir sprechen von 500, 000+ Eigenschaften).ersetzt in haben eine Where-Klausel?

Unser Host sagte mir, dass ich anstelle von Eigenschaften ersetzen verwenden sollte und alle veralteten Eigenschaften sollten als DEAD betrachtet werden. Ich habe dies getan, aber wegen Syntaxfehlern traten Probleme auf und ich konnte nirgends ein Beispiel für replace in mit einer where-Klausel finden (Ich möchte eine DEAD-Eigenschaft durch die neue Eigenschaft ersetzen, statt die alte zu löschen Eigenschaft und fügen Sie ein neues ein, um Optimierung sicherzustellen). Meine Frage sah wie folgt aus:

replace into table_name(column1, ..., columnn) values(value1, ..., valuen) where ID = idValue 

Natürlich habe ich berechnet IDValue und behandelt alles, aber ich hatte einen Syntaxfehler. Ich würde gerne wissen, ob ich falsch liege und es eine Where-Klausel gibt, in die ich ersetzen kann.

Ich habe eine alternative Lösung gefunden, die sogar besser ist als ersetzen (mit einer einfachen Update-Abfrage), weil Löschvorgänge hinter den Vorhängen passieren, wenn ich ersetzen, aber ich würde gerne wissen, wenn ich falsch liege wenn ich sage, dass ersetzen in hat keine Where-Klausel. Weitere Referenz finden Sie unter diesem Link:

http://dev.mysql.com/doc/refman/5.0/en/replace.html

Vielen Dank für Ihre Antworten im Voraus, Lajos Árpád

Antwort

0

In Ihrer Dokumentation Link zeigen sie drei alternative Formen des replace Befehl. Auch wenn sie elide ist, ist der einzige, der eine Where-Klausel akzeptieren kann, die dritte Form mit dem folgenden select.

replace scheint wie Overkill relativ zu update, wenn ich Ihre Aufgabe richtig verstehe.

+0

Vielen Dank für Ihre Antwort. In der Tat ist es ein Overkill, du hast absolut recht, ich will nur wissen, ob insert hat eine Where-Klausel zu filtern, was zu ersetzen, weil unser Gastgeber sagte, es hat und ich möchte die Angelegenheit klären (Wenn ich bereits gefunden habe Ich sehe keinen Grund, ihm das nicht zu sagen) ERSETZEN [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name, ...)] SELECT ... Wenn ich richtig verstanden habe, ist die obige Syntax, wo Sie sagen, dass ein wo erscheinen könnte. Sie haben Recht, aber die Where-Klausel ist in der Auswahl –

+0

Und das Ersetzen in hat keine wo in dem Beispiel, so denke ich ersetzen in hat keine wo. –

22

Ich kann sehen, dass Sie Ihr Problem gelöst haben, aber Ihre ursprüngliche Frage zu beantworten:

REPLACE INTO tut nicht haben eine WHERE Klausel.

REPLACE INTO Die Syntax arbeitet genau wieINSERT INTO Ausnahme, dass alle alten Zeilen mit demselben primären oder eindeutigen Schlüssel automatisch gelöscht wird, bevor die neue Zeile eingefügt wird.

Dies bedeutet, dass Sie anstelle einer WHERE-Klausel den Primärschlüssel zu den zu ersetzenden Werten hinzufügen sollten, um die Aktualisierung zu begrenzen.

REPLACE INTO myTable (
    myPrimaryKey, 
    myColumn1, 
    myColumn2 
) VALUES (
    100, 
    'value1', 
    'value2' 
); 

... liefert das gleiche Ergebnis wie ...

UPDATE myTable 
SET myColumn1 = 'value1', myColumn2 = 'value2' 
WHERE myPrimaryKey = 100; 

... oder genauer:

DELETE FROM myTable WHERE myPrimaryKey = 100; 
INSERT INTO myTable(
    myPrimaryKey, 
    myColumn1, 
    myColumn2 
) VALUES (
    100, 
    'value1', 
    'value2' 
); 
+1

Ja, das habe ich getan. Ich habe eine Abfrage ausgeführt, um eine "gute" Zeile zu finden und diese Zeile aktualisiert, so hatte ich eine Lösung, aber nachdem ich das gelöst hatte, war ich wirklich neugierig, ob das, was mir gesagt wurde, überhaupt wahr ist und basiert die Antworten von hier und meine Forschung (Dinge ausprobieren), das Ersetzen in fehlt eine Where-Klausel, so dass das Ersetzen in ist ein Löschen + einfügen, so dass meine Indizes noch nicht optimiert werden. Ich brauchte nur ein Update dort. Wie auch immer, danke für deine Antwort. –

+0

danke Ivar. Am hilfreichsten – khaverim

Verwandte Themen