Peter: Auslesen, ändern, wieder speichern

Hallo, ich habe diese Forum gefunden und gesehen das auch MSYSL Fragen gestellt werden können.

So habe ich ZWEI Kopier Probleme mit meiner Mysql Datenbank!

Ich rufe im ersten Schritt die Daten auf, die ich kopiert haben möchte:

select Feldname, UserID, Ergebniss FROM DB_Berechnung WHERE UserID=1 AND Jahr=2020

Die Treffer können auch mehrere Zeilen sein.

Anschliessend würde ich diese sofort wieder in die Datenbank für das Jahr 2021 zurückschreiben!

INSERT INTO DB_Berechnung SET Feldname=Feldname,UserID=1, Jahr=2021, Ergebniss=Ergebniss

Es ändert sich also nur das Jahr.

Diese würde ich gerne in einem Befehl direkt machen. Das ist mein erste Problem.

Das zweite, das mich beschäftigt, wäre, wenn der Datensatz schon vorhanden ist, sollte es dann kein INSERT sondern ein UPDATE werden.

Ich hoffe, das sich der ein oder andere Tipp findet.

Peter

  1. Tach!

    Diese würde ich gerne in einem Befehl direkt machen. Das ist mein erste Problem.

    INSERT INTO ... SELECT ...

    Das zweite, das mich beschäftigt, wäre, wenn der Datensatz schon vorhanden ist, sollte es dann kein INSERT sondern ein UPDATE werden.

    INSERT ... ON DUPLICATE KEY UPDATE

    Lässt sich beides auch kombinieren.

    dedlfix.

    1. Tag (auch),

      danke, das erste Problem konnte ich lösen:

      INSERT INTO DB_Berechnung (Feldname, Jahr, UserID, Ergebniss)
      SELECT a.Feldname, '2021', a.UserID, a.Ergebniss
      FROM DB_Berechnung a
      WHERE a.UserID=2 AND a.Jahr=2020
      

      Dass zweite wenn der Datensatz schon vorhanden ist, bekomme ich nicht hin.

      INSERT INTO DB_Berechnung (Feldname, Jahr, UserID, Ergebniss)
      SELECT a.Feldname, '2021', a.UserID, a.Ergebniss
      FROM DB_Berechnung a
      WHERE a.UserID=2 AND a.Jahr=2020
      ON DUPLICATE KEY UPDATE Feldname=a.Feldname, Jahr='2021', UserID=a.UserID, Ergebniss=a.Ergebniss
      
      

      Es kommt keine Fehlermeldung, aber das ON DUPLICATE wird trotzdem nicht ausgeführt!

      Peter

      1. Hallo Peter,

        du hast nicht gesagt, was denn statt dessen passiert. Ich nehme an, der Satz wird eingefügt und nicht aktualisiert.

        Die Frage ist demnach, ob es überhaupt zu einer DUPLICATE KEY Situation kommt. Das setzt einen entsprechenden Constraint auf der Tabelle voraus.

        An welchen Spalten wird festgemacht, ob ein Satz ein Duplikat eines anderen ist? Sind diese Spalten Primary Key, oder definieren sie einen Unique Index? Wenn nicht, fehlt der notwendige Constraint.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Ich glaube jetzt funktioniert es:

          Ich hatte kein Spalte/n definiert: Nun habe ich

          Feldname und Jahr als UNIQUE definiert

          Jetzt funktioniert es.

          **Aber etwas verstehe ich nicht!!!. **

          1. In meiner Datenbank-Tabelle ich eine Zeile.
          2. Führe Script aus
          3. In meiner Tabelle sind jetzt zwei Zeilen (phpmyadmin meldet 1 Datensatz eingefügt)
          4. Führe Script aus
          5. (phpmyadmin meldet 0 Datensatz eingefügt)perfekt
          6. Ändere im ersten Datensatz, Zeile den Wert von Ergebnis
          7. Führe Script aus
          8. (phpmyadmin meldet 2 Datensatz eingefügt) ???????

          Aber es wurde doch nur der eine eingelesen und da der zweite schon vorhanden war, dieser überschrieben. Dann müsste doch die Meldung 1 Datensatz eingefügt heißen?

          Peter

          1. Hallo Peter,

            versteh ich spontan auch nicht. Wenn der 2021-Satz schon da ist, sollte es immer nur einen Update geben.

            Ich habe es mal mit MySQL Workbench (mit meinem lokalen MySQL) nachgestellt, es sagt dazu:

            2 row(s) affected Records: 1  Duplicates: 1  Warnings: 0
            

            Es scheint, als wäre die 2 vorne einfach die Summe aus Records und Duplicates. Inhaltlich geschieht bei mir das Richtige. Also, schönen Gruß von Bobby McFerrin: Don't worry, be happy.

            Du hast auch eine kleine Inkonsistenz, aber die führt nicht zum Problem. Du fragst nämlich auf Jahr=2020 ab, setzt dann aber Jahr='2021', also einmal Zahl und einmal String. MYSQL ist in dieser Beziehung recht tolerant, aber man sollte trotzdem darauf achten, im SQL die Datentypen zu verwenden, die auch zu den Spaltendefinitionen passen.

            Rolf

            --
            sumpsi - posui - obstruxi
            1. Hallo Rolf, das mit dem String habe ich geändert. Super Danke.