Ankündigung

Einklappen
Keine Ankündigung bisher.

Replace into

Einklappen

Neue Werbung 2019

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

  • Replace into

    Hi,

    ich hab mich heute mal mit "REPLACE INTO" beschäftigt.
    Leider aktuell mit mässigen erfolg.

    Ich wollte faul sein und Datenbankeinträge entweder einfügen.. oder wenn vorhanden updaten.
    Hierzu habe ich folgenden Befehl zusammengebaut (zusammenbauen lassen mittels PHP)
    Code:
    REPLACE INTO `EIGENE_ANGABEN` SET `artikelnummer` = 'CLASSIQUE-20', `feldname` = 'Abteilung_s', `owned_text` = 'Damen';
    REPLACE INTO `EIGENE_ANGABEN` SET `artikelnummer` = 'CLASSIQUE-20', `feldname` = 'Stilbezeichnung_s', `owned_text` = 'Hoch';
    REPLACE INTO `EIGENE_ANGABEN` SET `artikelnummer` = 'CLASSIQUE-20', `feldname` = 'Saison_s', `owned_text` = 'Ganzjahresartikel';
    REPLACE INTO `EIGENE_ANGABEN` SET `artikelnummer` = 'CLASSIQUE-20', `feldname` = 'Absatzform_s', `owned_text` = 'Stiletto';
    REPLACE INTO `EIGENE_ANGABEN` SET `artikelnummer` = 'CLASSIQUE-20', `feldname` = 'Verschlussart_s', `owned_text` = 'Ohne Verschluss';
    Eingefügt werden diese Zeilen auch. Passt also soweit.
    Nur beim 2ten Durchlauf hab ich die gleichen Zeilen nochmal drin. Also nix mit REPLACE.

    So ganz hab ich den Befehl auch noch nicht verstanden. Um ein REPLACE durchzuführen müsste ich doch vergleichstabellen mitgeben.
    Artikelnummer und Feldname sind hier die Indikatoren. Nur wie bringe ich das dem SQL Befehl bei ?

    Danke

  • #2
    REPLACE INTO ist blöd. Verwende lieber INSERT INTO ON DUPLICATE KEY UPDATE. Wenn auch der Syntax etwas länger ist, so hat er seine Vorteile. Hier das Beispiel mit PDO, die Spalte ean ist der PRIMARY KEY:

    Code:
    INSERT INTO
        article(ean, title, description, created, updated)
    VALUES
        (:ean, :title, :description, NOW(), NOW())
    ON DUPLICATE KEY UPDATE
        title = VALUES(title),
        description = VALUES(description),
        updates = VALUES(updated)

    Kommentar


    • #3
      Na das is ja mal ne Anweisung.

      Prinzipell hab ich die auch Verstanden und so umgebaut:
      Code:
      INSERT INTO
          EIGENE_ANGABEN(`artikelnummer`, `feldname`, `owned_text`)
      VALUES
          (:`artikelnummer`, :`feldname`, :`owned_text`)
      ON DUPLICATE KEY UPDATE
          `artikelnummer` = VALUES('CLASSIQUE-20'),
          `feldname` = VALUES('Artikelname'),
          `owned_text` = VALUES('test');
      Gibt natürlich einen Fehler... auf anhieb klappt ja nie was :->
      Hier wird vermutlich aber das Tabellendesign schuld sein:

      Code:
      CREATE TABLE `EIGENE_ANGABEN` (
        `id` int(100) NOT NULL,
        `Artikelnummer` varchar(100) NOT NULL,
        `feldname` varchar(100) NOT NULL,
        `owned_text` varchar(255) NOT NULL,
        `owned_textarea` text NOT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
      
      
      ALTER TABLE `EIGENE_ANGABEN`
        ADD PRIMARY KEY (`id`);
      
      
      ALTER TABLE `EIGENE_ANGABEN`
        MODIFY `id` int(100) NOT NULL AUTO_INCREMENT;
      id würde ich ja bzgl. der eindeutigkeit benötigen. Da es auch noch ein AUTO_INCREMENT-Feld ist, muß es ja ein PRIMARY KEY sein.
      Ich wüste mir jetzt nicht zu behelfen das umzubauen. Ich bräuchte ja 2 weitere KEY felder (?)

      Kommentar


      • #4
        Code:
        INSERT INTO
            EIGENE_ANGABEN(artikelnummer, feldname, owned_text)
        VALUES
            (:artikelnummer, :feldname, :owned_text)
        ON DUPLICATE KEY UPDATE
            feldname = VALUES(feldname),
            owned_text = VALUES(owned_text);
        • Spaltennamen benötigen keine Anführungszeichen ausser wenn reservierte Namen verwendet werden.
        • Die Platzhalter benötigen keine Anführungszeichen
        • feldname = VALUES(feldname) bedeutet, dass der Wert der im INSERT eingefügt worden wäre, aktualisiert wird. Eine erneute Angabe bei gleichem Wert ist nicht notwendig.
        • Du benötigst einen UNIQUE KEY auf die Artikelnummer, damit der Update ausgelöst werden könnte, da du es wahrscheinlich nichts schaffst den Konflikt beim PRIMARY KEY auszulösen.

        Kommentar


        • #5
          sry. mein Fehler.
          Code:
           
           VALUES     (:artikelnummer, :feldname, :owned_text)
          Logisch.. DA kommen die Daten rein... und nicht unten nach DUPLICATE. Jetzt macht der Befehl auch Sinn.
          Nur mit mein Design komm ich nicht weiter. Packe ich ein KEY auf die Artikelnummer, bekomme ich logischerweise den Fehler, dass doppelte Eintäge vorhanden sind.

          Die sind auch gewollt und werden benötigt. Siehe posting 1.
          Kann ich mein Problem über REPLACE oder ON DUPLICATE überhaupt lösen?
          Es scheint mir nicht so zu sein

          Kommentar


          • #6
            Falls ein Konflikt beim INSERT aufgrund eines doppelten Wertes auftritt, so wird automatisch das UPDATE unter ON DUPLICATE KEY UPDATE ausgeführt.

            Kommentar


            • #7
              Hier ein einfaches Beispiel, dass du direkt in deinem Datenbankprogramm nachvollziehen kannst:

              Code:
              CREATE TABLE article (
                id int(11) unsigned NOT NULL AUTO_INCREMENT,
                ean varchar(128) DEFAULT NULL,
                title varchar(128) DEFAULT NULL,
                PRIMARY KEY (id),
                UNIQUE KEY ean (ean) USING BTREE
              ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
              Einen neuen Eintrag erstellen, ON DUPLICATE KEY UPDATE wird nicht ausgeführt.

              Code:
              INSERT INTO
                  article(ean, title)
              VALUES
                  (1337, 'foo')
              ON DUPLICATE KEY UPDATE
                  title = VALUES(title);
              Den vorhandenen Eintrag aktualisieren, da der INSERT durch die doppelte ean einen Fehler verursacht wird der ON DUPLICATE KEY UPDATE ausgeführt.

              Code:
              INSERT INTO
                  article(ean, title)
              VALUES
                  (1337, 'bar')
              ON DUPLICATE KEY UPDATE
                  title = VALUES(title);

              Kommentar


              • #8
                ja... aber ich bekomm ja kein UNIQUE KEY gesetzt.

                Meine Werte sind dafür falsch. Bzw. anders gesagt. Die Artikelnummer kommt IMMER mehrfach vor. Die Artikelnummer ist IMMER mit den Feld: Feldname in Kombination zu setzen.

                "Artikelnummer123" + "Artikelname"
                "Artikelnummer123" + "Abteilung"
                "Artikelnummer123" + "Saision"

                Ein Key auf Artikelnummer geht also nicht. Und somit geht die Anweisung ja nicht, weil kein Konflikt erzeugt werden kann. Denn die ID meldet ja keinen (einzigster Key)

                Kommentar


                • #9
                  Ich hab das Problem schon verstanden... Danke erstmal dass du dich hierzu erbarmst...

                  ABER:
                  Code:
                   
                     PRIMARY KEY (id),   UNIQUE KEY ean (ean) USING BTREE
                  DAS bekomm ich unmöglich umgesetzt. EAN wäre ja mein "Artikelnummern"-Feld. Und die gibt es mehrfach.
                  Somit kann das alles nicht klappen

                  Kommentar


                  • #10
                    Was ist denn der eigentliche PK in deiner Tabelle, artikelnummer+feldname? dann musst du eben einen zusammengesetzten PK definieren.

                    Kommentar


                    • #11
                      ID ist der Primäre

                      zusammensetzen ??
                      Ist das schon per MYSQL möglich ?
                      Denn die Struktur der Tabelle soll erhalten werden... sonst muß ich erst jeden Durchlauf wieder exploden.
                      Und lesen kommt erheblich öfterer vor als mal ein REPLACE (oder insert/Update)

                      Code:
                      CREATE TABLE `EIGENE_ANGABEN` (
                        `id` int(100) NOT NULL,
                        `Artikelnummer` varchar(100) NOT NULL,
                        `feldname` varchar(100) NOT NULL,
                        `owned_text` varchar(255) NOT NULL,
                        `owned_textarea` text NOT NULL
                      ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
                      
                      
                      ALTER TABLE `EIGENE_ANGABEN`
                      ADD PRIMARY KEY (`id`);
                      
                      
                      ALTER TABLE `EIGENE_ANGABEN`
                        MODIFY `id` int(100) NOT NULL AUTO_INCREMENT;

                      Kommentar


                      • #12
                        Ist das schon per MYSQL möglich ?
                        Eine DB ohne Zusammengesetzte Schlüssel/Indizes ist ziemlich nutzlos.

                        Kommentar

                        Lädt...
                        X