MySQL: INSERT … ON DUPLICATE KEY UPDATE

Published 2007-08-23, 13:38

Ich kann gar nicht oft genug darauf hinweisen:

INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;

Sinn der Sache:
Wenn ein INSERT einen doppelten Wert für ein UNIQUE- oder PRIMARY KEY-Feld erzeugen würde wird das UPDATE ausgeführt.

http://dev.mysql.com/doc/refman/4.1/en/insert-on-duplicate.html
http://www.mysqlperformanceblog.com/2006/05/29/insert-on-duplicate-key-update-and-summary-counters/

Vielleicht wird man dann irgendwann diese umständlichen if(mysql_insert_id() == 0) oder mysql_affected_rows-Konstruktionen los.

Topic(s): Link, MySQL 12 comments - :)

Diskussion zum Artikel

» Selbst kommentieren

  1. ( 1 )

    Hab ich das richtig verstanden. das wenn ich den befehl abgeben erzeugt er eien Doppelten Wert?

    Comment von Vitali am 10. September 2007

  2. ( 2 )

    Nein.

    Comment von Jan am 19. September 2007

  3. ( 3 )

    @Vitali: Gemeint ist, dass wenn ein doppelter Wert erzeugt wird, es zum Update kommt.
    Oder stehe ich auch gerade auf dem Schlauch?

    Comment von Weltpresse am 22. September 2007

  4. ( 4 )

    Nein, „Weltpresse“ hat Recht. Wenn ein doppelter Eintrag erzeugt werden würde, wird stattdessen ein UPDATE ausgeführt.

    Comment von Jan am 23. September 2007

  5. ( 5 )

    Nette Spielerei. Allerdings sollte man uniq Felder so im Datenbankdesign wählen, das die obige Funktion keinen Sinn macht.

    Comment von naden am 11. Oktober 2007

  6. ( 6 )

    Ich muss zugeben, das raff ich nun nicht ganz naden…

    Comment von Jan am 11. Oktober 2007

  7. ( 7 )

    Ich meine damit, man sollte wissen was man in die db schreibt. Wenn ein Feld uniq ist, dann sollte die db den Wert nicht automatisch ändern, sonst könnte ich ja auch ein autoincrement feld nutzen.

    Comment von naden am 11. Oktober 2007

  8. ( 8 )

    Ach, jetzt weiss ich was du meinst. ON DUPLICATE ist eher für counterähnliche Funktionen gedacht, nicht um Primärschlüssel zu ersetzen.

    Comment von Jan am 12. Oktober 2007

  9. ( 9 )

    Jo schon klar, das wird schon Sinn machen, sonst hätten die Jungs das nicht implementiert 😉

    Comment von naden am 13. Oktober 2007

  10. ( 10 )

    Hier mal ein anderes Beispiel:

    Schlecht, Select und entspechend Update bzw. Insert!

    $sql= „SELECT * FROM sample WHERE ID_SAMPLE=$id“;
    $res= mysql_query( $sql);
    if( $d= mysql_fetch_array( $res, MYSQL_ASSOC)){
    mysql_query( „UPDATE sample SET name=’$name‘, tag=’$tag‘ WHERE ID_SAMPLE=$id“);
    }else{
    mysql_query( „INSERT INTO sample VALUES( $id, ‚$name‘, ‚$tag‘)“);
    }

    Besser, Alles mit einem Insert und deshalb viel schneller!

    mysql_query( „INSERT INTO sample VALUES( $id, ‚$name‘, ‚$tag‘) ON DUPLICATE KEY UPDATE name=’$name‘,tag=’$tag'“);

    Comment von toosten am 25. Oktober 2007

  11. ( 11 )

    Nette Idee und schon wieder was gelernt. Haber zwar gerade keinen Anwendungsfall, aber Wissen schadet ja nie 😉

    Comment von Jens am 10. Dezember 2007

  12. ( 12 )

    Würde ich die durch diesen Beitrag entstandenen „Probleme“ alle lösen wollen, hätte ich wohl einiges zu tun, aber für zukünftige Projekte ist der Tipp Gold wert 😉

    Comment von tim am 1. März 2008

Selbst kommentieren

Trackback-URI, Kommentarfeed. XML-Feed





20 queries. 0,142 seconds.