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 by Vitali am 10. September 2007

  2. ( 2 )

    Nein.

    Comment by 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 by 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 by 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 by naden am 11. Oktober 2007

  6. ( 6 )

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

    Comment by 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 by 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 by Jan am 12. Oktober 2007

  9. ( 9 )

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

    Comment by 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 by 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 by 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 by tim am 1. März 2008

Sorry, the comment form is closed at this time.

22 queries. 0,210 seconds.