Bernhard: ON DUPLICATE KEY UPDATE und WHERE

Hallo nochmal,

nachdem ich nun meine Rechnungen gemacht habe, würde ich diese gerne in die Datenbank schreiben. Wenn für das Paper und den User schon ein Betrag vorhanden ist, soll er überschrieben werden, falls nicht ein neuer Datensatz angelegt werden.

INSERT INTO mathe SET betrag=:betrag
ON DUPLICATE KEY UPDATE betrag=:betrag
WHERE id_paper=100 AND user=10

Doch ich bekomme einen Fehler, mit dem ich mir nicht zu helfen weris.

Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to

  1. Hallo Bernhard,

    Lies das ver*piieep* - äh - vorzügliche Handbuch

    Die SET Klausel gehört zum UPDATE-, nicht zum INSERT-Befehl. Auch in der ON DUPLICATE Klausel des INSERT steht kein SET. Und Du musst im INSERT-Teil alle Spalten der Zeile angeben (außer AUTOINCREMENT-Spalten). Es ist ja eine neue Zeile.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Tach!

      Lies das ver*piieep* - äh - vorzügliche Handbuch

      Die SET Klausel gehört zum UPDATE-, nicht zum INSERT-Befehl.

      Ebenda: doch, zumindest bei MySQL.

      Das WHERE gehört nicht zum Insert. Die Auswahl des eventuell vorhandenen Datensatzes ergibt sich aus den Werten im SET assignment_list oder (colnames) VALUES (values).

      dedlfix.

      1. Hallo dedlfix,

        uuups - die Syntax 2 hab ich übersehen. Das ist aber wirklich MYSQL Spezial, der MS SQL Server und IBM DB2, meine Heimat-DBs, kennen sowas nicht.

        Rolf

        --
        sumpsi - posui - obstruxi
  2. Hi,

    nachdem ich nun meine Rechnungen gemacht habe, würde ich diese gerne in die Datenbank schreiben. Wenn für das Paper und den User schon ein Betrag vorhanden ist, soll er überschrieben werden, falls nicht ein neuer Datensatz angelegt werden.

    Umgekehrt: Du fügst einen neuen Datensatz hinzu - es sei denn, der Key ist schon vorhanden.

    Das setzt also erstmal einen Unique Key voraus.

    INSERT INTO mathe SET betrag=:betrag
    ON DUPLICATE KEY UPDATE betrag=:betrag
    WHERE id_paper=100 AND user=10
    

    ALso erst mal das Insert:

    INSERT INTO mathe (betrag, id_paper, user) VALUES (:betrag, 100, 10);
    

    Ich gehe mal davon aus, daß auf id_paper + user der Unique-Key existiert.

    Dann würde das INSERT scheitern, wenn der Datensatz mit id_paper 100 und user 10 schon existiert.

    INSERT INTO mathe (betrag, id_paper, user) VALUES (:betrag, 100, 10)
    ON DUPLIKATE KEY UPDATE betrag = :betrag;
    

    Ein WHERE braucht's für das UPDATE nicht, denn welche Zeile geändert werden soll, ist ja schon durch den unique key festgelegt.

    cu,
    Andreas a/k/a MudGuard