Keine Verwendung von "... ON DUPLICATE KEY UPDATE ..."

Ich habe einen Blog Artikel verfasst - Wie benutze ich die Suche richtig - Bitte diesen beachten und auch umsetzen bevor Ihr ein Neues Thema eröffnet!

  • Ein gut gemeinter Design-Tipp.


    Auf der Suche nach einem Fehler ist mir etwas anderes aufgefallen, was man geschickter umsetzten kann. Als Beispiel nehme ich mal die Bonus-Tipps:


    Im Prinzip wird der folgende SQL-Code zum Speichern eines Bonus-Tipps verwendet, wobei beide Anweisungen durch weiteren php-Code getrennt sind. Ähnliches findet man auch an anderen Stellen:

    SQL
    1. DELETE from bonus_tippsWHERE usr = $USER_ID and bid = $BID_ID;INSERT INTO bonus_tipps (bid,usr,answer,type,date)VALUES (...)

    Wenn man aber einen eindeutigen Schlüssel der Art

    Code
    1. unique key (bid,user,type);

    ... hätte, dann könnte man folgendes verwenden:

    SQL
    1. INSERT INTO bonus_tipps (bid,usr,answer,type,date)
    2. VALUES (...)
    3. ON DUPLICATE KEY UPDATE
    4. answer = $ANSWER,
    5. date = UNIX_TIMESTAMP();

    Dieses ist nicht nur eine Schönheits-Operation, sondern eine übliche Vorgehensweise mit dem entscheidenden Vorteil, dass es eine atomare Aktion ist. Außerdem würden auf DB-Seite doppelte Einträge verhindert.


    Im ersten Fall ist theoretisch eine Laufzeit-Problem vorhanden, wenn z.B. der Benutzer ein Formular absendet, dieses stockt und er es nochmals absendet. Sollten dann beide gleichzeitig zur Ausführung kommen, dann kann es 2 Einträge für den Bonus-Tipp des Spielergeben.