sqlanfänger: Mysql - Datensatz kopieren und Datum ändern

Hi,

ich würde gerne einige Datensätze in einer Tabelle kopieren, jedoch das Datum ändern. Wie macht man das?

Mein Lösungsansatz:

  
INSERT INTO Tabelle_A (X,Y,Z,date)  
VALUES (SELECT X,Y,Z FROM Tabelle_A AS TA  
WHERE TA.date like "%2010-07-14%", "2010-01-01 00:00")

Er meckert an, dass für "date" der Wert fehlt.
Weiss jemand weiter?

Gruss
sqlanfänger

  1. Hallo,

    Probier mal (ungetestet): INSERT INTO Tabelle_A (X,Y,Z,date)
    VALUES (SELECT X,Y,Z, date as "2010-01-01 00:00" FROM Tabelle_A AS TA
    WHERE TA.date like "%2010-07-14%")

    MfG
    tomgk

    1. Probier mal (ungetestet): INSERT INTO Tabelle_A (X,Y,Z,date)
      VALUES (SELECT X,Y,Z, date as "2010-01-01 00:00" FROM Tabelle_A AS TA
      WHERE TA.date like "%2010-07-14%")

      Geht nicht, es werden dann das Datum vom Ursprung eingetragen.

      1. Moin!

        Geht nicht, es werden dann das Datum vom Ursprung eingetragen.

        [1] Bezeichner als Bezeichner verwenden hilft oft ungemein.
        [2] Wozu im SELECT das Datum mit abfragen, wenn Du es gar nicht benötigst?

        INSERT INTO `Tabelle_A` (`X`, `Y`, `Z`, `date`)  
        VALUES (  
                SELECT `X`,`Y`,`Z`,"2010-01-01 00:00"  
                FROM `Tabelle_A`  
                WHERE `Tabelle_A`.`date` LIKE "2010-07-14%"  
               )  
        ;  
        
        

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix

        1. Hi!

          INSERT INTO Tabelle_A (X, Y, Z, date)

          VALUES (
                  SELECT X,Y,Z,"2010-01-01 00:00"
                  FROM Tabelle_A
                  WHERE Tabelle_A.date LIKE "2010-07-14%"
                 )
          ;

            
          MySQL mag schon aus grundsätzlichen Gründen weder deine noch EKKis noch tomgks noch andere Versionen, die INSERT und ein SELECT auf die selbe Tabelle in einer Query vereinen. <https://forum.selfhtml.org/?t=199108&m=1338630>  
            
            
          Lo!
          
          1. Hi,

            MySQL mag schon aus grundsätzlichen Gründen weder deine noch EKKis noch tomgks noch andere Versionen, die INSERT und ein SELECT auf die selbe Tabelle in einer Query vereinen. https://forum.selfhtml.org/?t=199108&m=1338630

            http://dev.mysql.com/doc/refman/5.1/en/insert-select.html
            “The target table of the INSERT statement may appear in the FROM clause of the SELECT part of the query. (This was not possible in some older versions of MySQL.) However, you cannot insert into a table and select from the same table in a subquery.”

            Bin mir gerade nicht sicher, wie das zu verstehen ist.
            INSERT INTO tabelle SELECT ... FROM tabelle WHERE ...
            müsste also nach der ersten Aussage inzwischen gehen, und nur die Verwendung echter Subqueries geht nicht ...?

            MfG ChrisB

            --
            “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
            1. Hi!

              MySQL mag schon aus grundsätzlichen Gründen weder deine noch EKKis noch tomgks noch andere Versionen, die INSERT und ein SELECT auf die selbe Tabelle in einer Query vereinen. https://forum.selfhtml.org/?t=199108&m=1338630
              http://dev.mysql.com/doc/refman/5.1/en/insert-select.html
              “The target table of the INSERT statement may appear in the FROM clause of the SELECT part of the query. (This was not possible in some older versions of MySQL.) However, you cannot insert into a table and select from the same table in a subquery.”

              Bin mir gerade nicht sicher, wie das zu verstehen ist.
              INSERT INTO tabelle SELECT ... FROM tabelle WHERE ...
              müsste also nach der ersten Aussage inzwischen gehen, und nur die Verwendung echter Subqueries geht nicht ...?

              Stimmt, den ersten Teil hatte ich überlesen. Während ich die Subquery-Varianten auch schön ausprobiert habe, hatte ich mir das beim INSERT...SELECT geschenkt. Mein Fehler. Das geht also doch ohne temporäre Tabelle.

              Es bleibt jedoch dabei, dass eine Subquery nicht mag, und das aus zweierlei Gründen. Der erste ist oben erwähnt. Der zweite ist, dass VALUES(...) mehrere durch Komma getrennte Werte haben möchte - entsprechend der Anzahl der aufgeführten Felder vor dem VALUES() -, eine Subquery jedoch, auch wenn sie mehrere Werte liefert, diese syntaktische Bedingung nicht erfüllen kann. Lediglich eine einzelne Spalte könnte hier von einer Subquery geliefert werden, aber dann tritt Grund 1 in Kraft.

              Lo!

          2. Moin!

            MySQL mag schon aus grundsätzlichen Gründen weder deine noch EKKis noch tomgks noch andere Versionen, die INSERT und ein SELECT auf die selbe Tabelle in einer Query vereinen. https://forum.selfhtml.org/?t=199108&m=1338630

            Guckst Du hier

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix

            1. Hi!

              MySQL mag schon aus grundsätzlichen Gründen weder deine noch EKKis noch tomgks noch andere Versionen, die INSERT und ein SELECT auf die selbe Tabelle in einer Query vereinen. https://forum.selfhtml.org/?t=199108&m=1338630
              Guckst Du hier

              Probierst du aus.

              Ich nehme ja mal an, dass er auf das falsche Posting geantwortet hat.

              Lo!

        2. INSERT INTO Tabelle_A (X, Y, Z, date)

          VALUES (
                  SELECT X,Y,Z,"2010-01-01 00:00"
                  FROM Tabelle_A
                  WHERE Tabelle_A.date LIKE "2010-07-14%"
                 )
          ;

          
          >   
            
          FUNKTIONERT einwandfrei, vielen DANK!  
          (Auch an die anderen).
          
          1. Hi!

            INSERT INTO Tabelle_A (X, Y, Z, date)

            VALUES (
                    SELECT X,Y,Z,"2010-01-01 00:00"
                    FROM Tabelle_A
                    WHERE Tabelle_A.date LIKE "2010-07-14%"
                   )
            ;

            
            >   
            > FUNKTIONERT einwandfrei, vielen DANK!  
              
            Unter welchen Bedingungen soll das funktionieren? MySQL 5.1.45 und 5.0.90 weigern sich bei mir jedefalls schon aus syntaktischen Gründen, Statements dieser Art auszuführen.  
              
              
            Lo!
            
            1. Hi!

              INSERT INTO Tabelle_A (X, Y, Z, date)

              VALUES (
                      SELECT X,Y,Z,"2010-01-01 00:00"
                      FROM Tabelle_A
                      WHERE Tabelle_A.date LIKE "2010-07-14%"
                     )
              ;

              
              > >   
              > > FUNKTIONERT einwandfrei, vielen DANK!  
              >   
              > Unter welchen Bedingungen soll das funktionieren? MySQL 5.1.45 und 5.0.90 weigern sich bei mir jedefalls schon aus syntaktischen Gründen, Statements dieser Art auszuführen.  
              >   
              
              Server Version: 5.0.67
              
    2. Mahlzeit tomgk,

      Probier mal (ungetestet): INSERT INTO Tabelle_A (X,Y,Z,date)
      VALUES (SELECT X,Y,Z, date as "2010-01-01 00:00" FROM Tabelle_A AS TA
      WHERE TA.date like "%2010-07-14%")

      Sinnvoller wäre

      INSERT INTO Tabelle_A (X, Y, Z, date)  
      VALUES (  
              SELECT X  
              ,      Y  
              ,      Z  
              ,      "2010-01-01 00:00" AS date  
                FROM Tabelle_A AS TA  
               WHERE TA.date LIKE "%2010-07-14%"  
             )
      

      MfG,
      EKKi

      --
      sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. Hi,

    ich würde gerne einige Datensätze in einer Tabelle kopieren, jedoch das Datum ändern. Wie macht man das?

    INSERT INTO Tabelle_A (X,Y,Z,date)

    VALUES (SELECT X,Y,Z FROM Tabelle_A AS TA
    WHERE TA.date like "%2010-07-14%", "2010-01-01 00:00")

    
    >   
    > Er meckert an, dass für "date" der Wert fehlt.  
      
    Ja dann gib halt einen an.  
      
    MfG ChrisB  
      
    
    -- 
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    
  3. Hi!

    ich würde gerne einige Datensätze in einer Tabelle kopieren, jedoch das Datum ändern. Wie macht man das?

    Indem du mit richtiger Syntax ein anderes zuweist. Schauen wir mal, was alles falsch ist.

    INSERT INTO Tabelle_A (X,Y,Z,date)

    Du möchtest 4 Werte einfügen, zudem verwendest du das Schlüsselwort date als Spaltenname. Soweit kein Problem, aber du musst das dann zur Unterscheidung von beispielsweise der Funktion DATE() als Bezeichner kennzeichnen. Alternativ kannst du auch einen Namen nehmen, der nicht reserviert ist.

    VALUES (SELECT X,Y,Z FROM Tabelle_A AS TA
    WHERE TA.date like "%2010-07-14%", "2010-01-01 00:00")

    Drei Werte möchtest du aus einer Subquery holen und einen so hinzufügen. Subquerys müssen immer in eigenes Klammernpaar eingebettet sein, auch dann wenn für andere Syntaxelemente bereits Klammern vorhanden sind.

    Außerdem sieht MySQL offensichtlich auch nicht die Ergebnisse der Subquery als Einzelwerte an, denn es beklagt sich auch bei korrigierter Klammersetzung, dass die Spaltenzahlen nicht übereinstimmen. Die Subquery ist jedoch auch gar nicht notwendig, denn es gibt eine spezielle INSERT-Syntax: INSERT ... SELECT. Formuliere dazu zunächst das SELECT so, dass es die gewünschten vier Werte in je einer Spalte liefert und ergänze dann das INSERT INTO Tabelle_A.

    Doch halt! Jetzt kommt noch eine weitere Besonderheit zum Tragen: MySQL gestattet es nicht, eine Tabelle zu bearbeiten, während mit einer Subquery lesend darauf zugegriffen wird. Da brauchst du nun zwei Schritte:

    • Selektiere die Daten in eine temporäre Tabelle
      CREATE TEMPORARY TABLE foo SELECT ...
    • Füge mit INSERT ... SELECT die Daten aus der temporären Tabelle in die eigentliche Tabelle ein.
      Die temporäre Tabelle wird beim Verbindungsabbau automatisch entsorgt. Sie händisch zu löschen ist also nicht unbedingt nötig.

    Lo!

    1. Hi!

      Doch halt! Jetzt kommt noch eine weitere Besonderheit zum Tragen: MySQL gestattet es nicht, eine Tabelle zu bearbeiten, während mit einer Subquery lesend darauf zugegriffen wird. [...]

      Dieser Teil ist obsolet, weil nicht ganz richtig: https://forum.selfhtml.org/?t=199108&m=1338700.

      Lo!