mysql5 "ON DUPLICATE KEY UPDATE" problem

  • Allgemein

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von raist10.

    mysql5 "ON DUPLICATE KEY UPDATE" problem

    ich möchte den wert von spalte 1 bzw ID=41 prüfen wenn vorhanden : update sonst insert aber ich bin zu doov

    dev.mysql.com/doc/refman/5.1/de/insert-on-duplicate.html

    wenn ich ein where rein mache :
    MySQL-ERROR
    MySQL meldet:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE ID=41' at line 1

    Fehler bei der Anfrage:
    insert INTO benutzer(Benutzername, Passwort, Email, Salt1, Salt2) VALUES ('1','2','3','4','5') ON DUPLICATE KEY UPDATE WHERE ID=41
    die erklärung auf mysql kapier ich auch grad nich so ganz

    SQL-Abfrage

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


    Diese Anweisung ist identisch mit den folgenden beiden
    Anweisungen:

    SQL-Abfrage

    1. INSERT INTO table (a,b,c) VALUES (1,2,3)
    2. ON DUPLICATE KEY UPDATE c=3;
    3. INSERT INTO table (a,b,c) VALUES (4,5,6)
    4. ON DUPLICATE KEY UPDATE c=9;


    ich würd auch das ondublicate weglassen nur ich finde keinen weg zu prüfen ob die zeile schon vorhanden ist ohne einen 2zeiler zu bauen bzw ne if then else im client. 8|
    Bilder
    • mysql5 dublicate key.png

      52 kB, 1.020×584, 224 mal angesehen

    Triple-Axe schrieb:


    ich würd auch das ondublicate weglassen nur ich finde keinen weg zu prüfen ob die zeile schon vorhanden ist ohne einen 2zeiler zu bauen bzw ne if then else im client. 8|


    Was wäre an demn 2-Zeiler, bzw. das If-Then-Else Konstrukt im Client denn so verkehrt?

    Mal davon ab das ON DUPLICATE KEY nicht so wirklich das ist was Du brauchst, weil das ein purer Automatismus ist und nicht darauf ausgelegt eine bestimmte ID zu checken, sondern schlicht darauf das falls IRGENDEIN Unique Identifier durch INSERT doppelt vorhanden sein würde eben kein INSERT erfolgt sonder der bestehende DS ein UPDATE erfährt.

    Die Fehlermeldung kommt weil nachdem UPDATE zwar eine Value-Veränderung angegeben werden kann, aber keine WHERE-Klausel. Die Where-Klausel würde wenn hier nur VOR der Anweisung ON DUPLICATE passen, aber da funzt sie auch nicht weil ein INSERT-Statement keine WHERE-Klausel akzeptiert ... sonst wäre es ja ein UPDATE-Statement. ^^

    Aber solange Du im SQL-Statement keinen Unique Identifier ansprichst, ist das eh alles für die Katz.

    Funktionieren würde es so z.B.:

    [MySQL]
    INSERT INTO benutzer (ID, Benutzername, Passwort, Email, Salt1, Salt2) VALUES (41,'1','2','3','4','5') ON DUPLICATE KEY UPDATE Salt2 = Salt2 + 1[/MySQL]

    (Beachte dabei die Ergänzung um das Feld ID und bei Values die Ergänzung des Wertes für ID ... habe angenommen das ID Numeric ist und daher auf die Hochkommas für den Value zu ID verzichtet)

    Diese Anweisung würde jetzt dafür sorgen das ein neuer DS mit der ID 41 angelegt wird, falls aber ID 41 schon existiert dann wird der vorhandene DS mit der ID 41 geupdated und bekommt für Salt2 anstatt 5 eben die 6 eingetragen.

    Gruß

    Rainer

    P.S.: Übrigens ... großes Lob für die konkrete und sehr gut geschilderte Fragestellung, vor allem auch mit passendem Link zur Quelle ... ohne den hätte ich vermutlich nicht geantwortet weil es mir zuviel Aufwand gewesen wäre die SQL-Function nach zu googlen um zu antworten. Ich habe von der zwar schon mal gehört, aber selber noch nie verwendet. ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „raist10“ ()

    ich danke dir vielmals nun sehe ich klarer

    werde nun da du es so deutlich erklärt hast doch erst mal in der ds mit select die ergebnisse zählen und wenn mehr als 0 rauskommt
    updaten sonst einen insert machen

    mfg

    edit : ich versuchs immer mit "tante google" aber manchmal kapier ich nicht was sie sagt *G

    Triple-Axe schrieb:


    werde nun da du es so deutlich erklärt hast doch erst mal in der ds mit select die ergebnisse zählen und wenn mehr als 0 rauskommt
    updaten sonst einen insert machen


    Nehme an Du meinst mit "select die ergebnisse zählen" die Aggregat-Funktion Count. Aber sicherheitshalber hier ein Beispiel wie man das einfach macht:

    [MySQL]
    strSQL = "SELECT Count(ID) FROM MeinTable WHERE ID = " & intID[/MySQL]


    edit : ich versuchs immer mit "tante google" aber manchmal kapier ich nicht was sie sagt *G


    Ich auch wenn ich was nicht weiss, aber nicht wenn ich hier im Forum auf eine Frage antworte ... das wäre mir zuviel Umstand. ;)

    Gruß

    Rainer

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „raist10“ ()