Announcement

Collapse
No announcement yet.

Update wenn Eintrag existiert

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Update wenn Eintrag existiert

    Hallo,

    ich muss einen Update befehl ausführen lassen, wenn eine email Adresse in einer Spalte existiert, bzw. wenn noch nicht, dann einen insert befehl.

    An sich nicht so schwierig mit INSERT ... ON DUPLICATE KEY UPDATE

    aber das problem,

    die Mail Adresse ist nicht eindeutig.

    Der INSERT ... ON DUPLICATE KEY UPDATE befehl prüft auch immer den Primarykey denn ich ja nicht habe und dadurch wird nie ein Update ausgelöst.

    Beispiel:
    insert into adressen_asp (rec_id,email,land,infos) values (s,"[email protected]","AT","neu")
    ON DUPLICATE KEY UPDATE info= "nicht neu"


    Ich möchte alle Einträge mit der Mailadresse "[email protected]" das feld info mit "nicht neu" ändern lassen.
    falls die Mailadresse nicht existiert, soll er eine neue Zeile anlegen.

    Mysql 4.22

    Danke!

  • #2
    Klingt nach 'ner Spammer-Db :-))

    Comment


    • #3
      Hallo,
      Originally posted by unique24 View Post
      ...Der INSERT ... ON DUPLICATE KEY UPDATE befehl prüft auch immer den Primarykey denn ich ja nicht habe und dadurch wird nie ein Update ausgelöst.
      Nein, der INSERT ... ON DUPLICATE KEY UPDATE prüft ob im Falle eines INSERT eine UNIQUE-KEY Verletzung vorliegt. Das kann der PK oder jeder andere UNIQUE-Constraint sein.

      Für den Fall das es keine Eindeutigkeit gibt, hilft dir nur das Zwei-Schritt-Verfahren:
      1. Mittels SELECT prüfen ob die Adresse existiert
      2. Jenachdem ein Update oder Insert ausführen

      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Hallo,

        nein, ist keine Spammer DB :-)
        Ist unsere Warenwirtschaft und auf unserer Webseite kann man sich für einen Newsletter registrieren lassen.

        Wenn die Mailadresse nicht existiert muss dieser Kunde angelegt werden und als Newsletter.
        Interesenten markiert werden.
        Wenn er existiert, nur als newsletter Kunden markieren.

        @Falk
        UNIQUE-KEY Verletzung:
        Bin mir nicht sicher ob ich es richtig verstehe. Die Tabelle hat einen Primärschlüssel ... die ID.
        Wenn ich beim Insert nur die Mailadresse angeben und die Mailadresse schon existiert, macht er ein update, sonst einen Insert?
        Ich muss aber beim Insert mehrere Spalten angeben ... prüft er jede ob diese schon existiert?
        Dachte er prüft nur den Primärschlüssel.


        2 Schritt verfahren:
        Die ganze Abwicklung macht ein Newsletterprogramm und ich kann nur einen SQL String hinterlegen.

        Hättest du ein Beispiel für mich?


        Danke

        Hannes

        Comment


        • #5
          Originally posted by unique24 View Post
          ....
          Bin mir nicht sicher ob ich es richtig verstehe. Die Tabelle hat einen Primärschlüssel ... die ID.
          Wenn ich beim Insert nur die Mailadresse angeben und die Mailadresse schon existiert, macht er ein update, sonst einen Insert?
          .....
          Hannes
          Hallo,

          Verstehe ich dies richtig : Diese ID (Dein PK) ist der Schlüssel des Kunden? Wenn dies der Fall ist, kannst du ja in deinem Interface entschieden, ob es ein neuer Kunde ist (Es wird keine ID mitgeliefert) oder ob der Kunde schon existiert (-->Update dieses Kunden).

          Gruss

          Comment


          • #6
            Hallo,

            vielen Dank für deine Antwort.

            Ich erkläre es nochmal:
            Unsere WaWi hat eine Tabelle. Sie hat einfach gesagts folgenden Aufbau:
            rec_id;name;land;info

            Unser newsletter programm erkennt wenn sich jemand auf unserer Webseite zu einem Nesletter angemeldet hat und stellt NUR die Mailadresse als Platzhalter zur verfügung.

            Wenn sich jemand anmeldet und diese Mailadresse existiert schon in der Tabelle, soll er ins info reinschreibern "newsletter", wenn die Mailadresse noch nicht existiert, soll er eine neue zeile schreiben mit:
            name: "kunde"
            Land: "DE"
            info: "newsletter"

            Mein Problem:
            er erzeugt mir IMMER eine neue zeile, sofern ich nicht den Primärschlüssel angeben, denn ich aber ja nicht weiß.

            Der Befehl:
            insert into adressen_asp (email,land,info) values ("[email protected]","AT","newsletter")
            ON DUPLICATE KEY UPDATE info= "newsletter"

            führt immer zu einer neuen Zeile ... geben ich die Rec_ID an ... dann nicht.
            Leider kann ich die rec_id nicht zusammen mit dem insert ausführen lassen, da es sich auf die selbe Tabelle bezieht.

            wer weiß eine Lösung?

            danke

            Hannes

            Comment


            • #7
              Originally posted by unique24 View Post
              Mein Problem:
              er erzeugt mir IMMER eine neue zeile, sofern ich nicht den Primärschlüssel angeben, denn ich aber ja nicht weiß.

              Der Befehl:
              insert into adressen_asp (email,land,info) values ("[email protected]","AT","newsletter")
              ON DUPLICATE KEY UPDATE info= "newsletter"

              führt immer zu einer neuen Zeile ... geben ich die Rec_ID an ... dann nicht.
              Leider kann ich die rec_id nicht zusammen mit dem insert ausführen lassen, da es sich auf die selbe Tabelle bezieht.

              wer weiß eine Lösung?

              danke

              Hannes

              OK, jetzt hab ich's (denke ich) kapiert. Du wirst vermutlich nicht darum herumkommen, zuerst zu prüfen, ob es diese Mailadresse gibt und anschliessend den Insert oder Update durchführen. Ist allerdings nicht wirklich transaktionssicher....

              Gruss

              Comment


              • #8
                Hallo dbwizard,

                kann man dies in einer einzigen Abfrage machen, bzw. kann man so einen Wert zwischenspeichern?
                ich kann an sich auch 2 Querys laufen lassen, aber wie den einen Wert in die andere Query bringen?

                DAnke

                Comment


                • #9
                  Originally posted by unique24 View Post
                  Hallo dbwizard,

                  kann man dies in einer einzigen Abfrage machen, bzw. kann man so einen Wert zwischenspeichern?
                  ich kann an sich auch 2 Querys laufen lassen, aber wie den einen Wert in die andere Query bringen?

                  DAnke
                  Hallo,

                  Ich würde eine Stored Procedure dafür benutzen, oder alternativ dies in deiner Bussiness Tier (falls vorhanden) implementieren


                  Gruss

                  Comment


                  • #10
                    Hallo,

                    hmmm ... Stored Procedure für Mysql 4.22 habe ich noch nie genutzt.
                    Hast du einen Tipp wie man so etwas erstellt?

                    Habe zwar die Hilfe von mysql, aber die Befehle werden immer als falsch interpretiert. Kann man die Stored Procedure´s im Query Browser von Mysql anlegen?

                    Danke
                    Danke

                    Comment


                    • #11
                      Originally posted by unique24 View Post
                      Hallo,

                      hmmm ... Stored Procedure für Mysql 4.22 habe ich noch nie genutzt.
                      Hast du einen Tipp wie man so etwas erstellt?

                      Habe zwar die Hilfe von mysql, aber die Befehle werden immer als falsch interpretiert. Kann man die Stored Procedure´s im Query Browser von Mysql anlegen?

                      Danke
                      Danke
                      Weder noch das kann erst MySQL 5

                      Comment


                      • #12
                        Hallo,

                        na dann habe ich leider wohl ein Problem :-(

                        Dies würde ja klappen:
                        set @ID = (SELECT a.rec_id FROM adressen_asp a where email like "[email protected]" limit 1);

                        insert into adressen_asp (rec_id, addr_id, name, email, land,info) values (@ID, 6331,"Div Newsletterkunde","[email protected]","DE","newsletter")
                        ON DUPLICATE KEY UPDATE info= "newsletter"

                        Leider nur im mysql Query Browser ... über vb.net und auch über das Newsletterprogramm scheitert es, weil es die 2 befehle wohl nicht trennen kann.

                        Gibt es sonst noch eine Möglichkeit?

                        Danke!

                        Comment


                        • #13
                          Hallo,
                          Originally posted by unique24 View Post
                          ...Wenn ich beim Insert nur die Mailadresse angeben und die Mailadresse schon existiert, macht er ein update, sonst einen Insert?
                          Ich muss aber beim Insert mehrere Spalten angeben ... prüft er jede ob diese schon existiert?
                          Dachte er prüft nur den Primärschlüssel.
                          Wie ich schon gesagt habe, es wird nicht geprüft ob ein bestimmter Wert schon existiert, sondern ob eine UNIQUE-Key-Verletzung vorliegt. Wenn es auf deiner Tabelle neben dem PK keinen weiteren eindeutigen Schlüssel (UNIQUE-Constraint) gibt, dann gibt es auch keine Verletzung wenn dieser nicht angegeben ist und es wird immer ein neuer DS angelegt - das hast du ja schon gemerkt. Wenn du also für das E-Mail-Feld keinen UNIQUE-Constraint anlegen kannst, nützt dir die ON DUPLICATE KEY UPDATE Syntax nichts.

                          Originally posted by unique24 View Post
                          ...
                          Dies würde ja klappen:
                          set @ID = (SELECT a.rec_id FROM adressen_asp a where email like "[email protected]" limit 1);

                          insert into adressen_asp (rec_id, addr_id, name, email, land,info) values (@ID, 6331,"Div Newsletterkunde","[email protected]","DE","newsletter")
                          ON DUPLICATE KEY UPDATE info= "newsletter"

                          Leider nur im mysql Query Browser ... über vb.net und auch über das Newsletterprogramm scheitert es, weil es die 2 befehle wohl nicht trennen kann.
                          Du mußt die zwei Befehle in zwei Abfragen packen. Die Servervariable würde erhalten bleiben, solange die gleiche Connection verwendet wird. Da du aber nur eine Abfrage ausführen kannst, scheidet das wohl aus.
                          Allerdings glaube ich auch nicht das es wirklich funktioniert, da für den nicht existierend Fall ein NULL-Wert für den PK übergeben wird und das dürfte zum Fehler führen. Der Autoincrement greift nicht, wenn das Feld explizit angegeben ist.

                          Ich schließe mich also meinen Vorredner an. Wenn du keine Möglichkeit hast es in der App zu implementieren - Beste Lösung: Stored Procedure! Sicher ein weiterer Grund auf MySQL 5 umzusteigen .

                          Gruß Falk
                          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                          Comment

                          Working...
                          X