Help: On Duplicate Key Update ....

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Help: On Duplicate Key Update ....

    ich bekomme folgenden fehler .....

    You have an error in your SQL syntax near 'ON DUPLICATE KEY UPDATE UdDataPercent = NULL, ' at line 13

    was ist nicht in ordnung? ein normaler insert ohne 'ON DUPLICATE KEY UPDATE ...' funktioniert wunderbar.

    laut mysql.com muss der syntax so aussehen

    Code:
    INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
        [INTO] tbl_name [(col_name,...)]
        VALUES ((expression | DEFAULT),...),(...),...
        [ ON DUPLICATE KEY UPDATE col_name=expression, ... ]

    PHP-Code:
    /*
     *
     *  CREATE TABLE Sites_UserDemographicGroups (
     *    SUdId int(11) NOT NULL auto_increment,
     *    SiteId int(11) NOT NULL default '0',
     *    UdId int(11) NOT NULL default '0',
     *    UdDataSort int(4) NOT NULL default '0',
     *    UdDataPercent int(11) default NULL,
     *    UdDataInfo varchar(70) default NULL,
     *    UdDataOther tinytext,
     *    PRIMARY KEY  (SUdId),
     *    UNIQUE KEY SiteId_UdId_UdDataSort (SiteId,UdId,UdDataSort)
     *  ) TYPE=MyISAM;
     *
     *********************/

    $sql "INSERT INTO Sites_UserDemographicGroups (SiteId,
                                                     UdId,
                                                     UdDataSort,
                                                     UdDataPercent,
                                                     UdDataInfo,
                                                     UdDataOther)
                                             VALUES ("
    .$save["SiteId"].",
                                                     "
    .$save["UdId"].",
                                                     "
    .$save["UdDataSort"].",
                                                     "
    .$save["UdDataPercent"].",
                                                     "
    .$save["UdDataInfo"].",
                                                     "
    .$save["UdDataOther"].")
                            ON DUPLICATE KEY UPDATE UdDataPercent = "
    .$save["UdDataPercent"].",
                                                    UdDataInfo = "
    .$save["UdDataInfo"].",
                                                    UdDataOther = "
    .$save["UdDataOther"]."";

    $result mysql_query($sql) or die(mysql_error()); 
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |



  • #2
    Ein key darf kein null enthalten.
    Beantworte nie Threads mit mehr als 15 followups...
    Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

    Kommentar


    • #3
      Wie ... du verwendest schon MySQL 4.1??
      carpe noctem

      [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
      [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

      Kommentar


      • #4
        Original geschrieben von MelloPie
        Ein key darf kein null enthalten.
        ok. ich habe nun definitiv kein NULL drin.

        Code:
        // echo $sql;
        
        INSERT INTO Sites_UserDemographicGroups (SiteId,
                                                               UdId,
                                                               UdDataSort,
                                                               UdDataPercent,
                                                               UdDataInfo,
                                                               UdDataOther)
                                                       VALUES (2,
                                                               3,
                                                               990,
                                                               0,
                                                               ' ',
                                                               'bitte sonstige dfdf
        dfdfd')
                                      ON DUPLICATE KEY UPDATE UdDataPercent = 0, UdDataInfo = ' ', UdDataOther = 'bitte sonstige dfdf
        dfdfd'
        und dennoch.....
        You have an error in your SQL syntax near 'ON DUPLICATE KEY UPDATE UdDataPercent = 0, UdDataInfo = ' ', UdDataOther = 'bitt' at line 13

        @goth
        nein... -> 3.23.41
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar


        • #5
          Original geschrieben von Abraxax
          @goth
          nein... -> 3.23.41
          Dann solltest Du mal den Text der Beschreibung genau lesen ...

          If you specify ON DUPLICATE KEY UPDATE clause (new in MySQL 4.1.0), and a row is inserted that would cause a duplicate value in a PRIMARY or UNIQUE key, an UPDATE of the old row is performed.
          carpe noctem

          [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
          [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

          Kommentar


          • #6
            Original geschrieben von goth
            Dann solltest Du mal den Text der Beschreibung genau lesen ...
            mist.....

            ich hatte nur das genauer gelesen.
            The col_name=expression syntax is supported in MySQL Version 3.22.10 or later.
            daher war ich wohl irritiert.
            das andere stand ja viel weiter unten.

            danke dennoch. muss ich es eben mit zwei queries machen.....
            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


            Kommentar


            • #7
              Nimm doch REPLACE. Dadurch wird zwar ein vorhandener Datensatz nicht aktualisiert sondern überschrieben (achtung, die auto_increment id würde sich ändern!!), aber vielleicht ist das ja was für dich.
              [color="#334D7B"]"Los, lass uns loslegen! Hm ? Quatschen können wir hinterher immer noch!"[/color]
              [color="#9C5245"]"Aber Bommel, wir können jetzt nicht bumsen. Wir müssen doch erst den Kindern - ... "[/color]
              [color="#334D7B"]"Ja ja ja. Du willst immer nur das Eine. Buchstabenzeigen, Buchstabenzeigen - meine Gefühle sind dir wohl scheißegal."[/color]

              © Harald Schmidt

              Kommentar


              • #8
                danke dir für die info.... aber ich muss seltener updaten als inserten.

                daher mache ich das mit zwei queries.
                - normaler insert
                - falls key-verletzung entsprechend update.

                nur in ca. 20% der fälle wäre ein update nochwendig.

                ausserdem ist es nicht gut, wenn die id sich ändert.

                danke dir dennoch.
                INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                Kommentar


                • #9
                  Seit wann ändert sich der primary key bei nem replace???
                  Beantworte nie Threads mit mehr als 15 followups...
                  Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

                  Kommentar


                  • #10
                    mysql.com
                    REPLACE works exactly like INSERT, except that if an old record
                    in the table has the same value as a new record on a UNIQUE
                    index or PRIMARY KEY, the old record is deleted before the
                    new record is inserted.

                    somit wäre der key futsch und ein neuer würde angelegt. so sehe
                    ich das zumindest. getestet habe ich das nicht, da ich meine lösung
                    bereits gefunden hab. aber der text ist meiner meinung nach eindeutig.....
                    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                    Kommentar


                    • #11
                      Nehmen wir an Du hast einen Datensatz in Deiner Tabelle mit einem
                      1,'hallo','Welt'
                      Wobei 1 der PRI KEY ist
                      und Du machst ein
                      REPLACE INTO tbl VALUES(1,'Tschö','Welt')

                      Dann bleibt der key erhalten, genau weil erst deleted und dann insertd wird...

                      Denn:
                      REPLACE works exactly like INSERT, except that if an old record
                      in the table has the same value as a new record on a UNIQUE
                      index or PRIMARY KEY, the old record is deleted before the
                      new record is inserted.

                      Sagt ja dass der gleiche KEy da ist, also delete old row insert new row mit gleichem key trara...
                      Im Endeffekt bleibt damit auch ein auto_increment wert erhalten...
                      Beantworte nie Threads mit mehr als 15 followups...
                      Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

                      Kommentar


                      • #12
                        ok. das leuchtet ein. aber was ist, wenn ich noch keinerlei daten in der tabelle habe oder neue hinzufüge?

                        beiden muss ich ja nunmal mit INSERT machen. und wenn dann eine key-verletzung auftritt, kann ich REPLACE oder UPDATE machen.

                        oder geht das auch mit REPLACE ohne PK-änderung?

                        in deinem beispiel hast du die 1 ja angegeben.
                        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                        Kommentar


                        • #13
                          geht auch ohne...
                          ist ja exact wie ein INSERT, d.h auch der auto_increment wird automatsich erstellt...
                          Es sei denn Du gibst ihn explizit an
                          Beantworte nie Threads mit mehr als 15 followups...
                          Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

                          Kommentar


                          • #14
                            ok. wenn ich keinen PK angebe, dann wird er doch aber ersetzt. und dann hätte ich ein problem. oder erkennt mysql den key und verwendet ihn wieder? wahrscheinlicht nicht.
                            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                            Kommentar


                            • #15
                              Du hast da was übersehen MelloPie: Abraxax gibt in seinem SQL Befehl nicht den Primary Key an; der ist möglicherweise unbekannt (?). Auf den Feldern SiteId,UdId,UdDataSort liegt ein UNIQUE Key. Beim REPLACE findet MySQL schon eine Reihe damit, löscht diese und fügt eine neue ein. Da aber kein Primary Key vorgegeben wird, wird der nächste Autoindex genommen - und der ist natürlich ein anderer als der vorherige.

                              Bei deinem Beispiel mit REPLACE INTO tbl VALUES(1,'Tschö','Welt') ist der Fall ja klar, weil nur nur einen Index auf dem ersten Feld hast und zudem den Key auch explizit angibst.
                              [color="#334D7B"]"Los, lass uns loslegen! Hm ? Quatschen können wir hinterher immer noch!"[/color]
                              [color="#9C5245"]"Aber Bommel, wir können jetzt nicht bumsen. Wir müssen doch erst den Kindern - ... "[/color]
                              [color="#334D7B"]"Ja ja ja. Du willst immer nur das Eine. Buchstabenzeigen, Buchstabenzeigen - meine Gefühle sind dir wohl scheißegal."[/color]

                              © Harald Schmidt

                              Kommentar

                              Lädt...
                              X