Hans: MySQL Multi-Update

Hallo,

ich führe folgenden MULTI-INSERT in eine Mysql-Datenbank aus:

INSERT INTO test
(id,didIdo,MidIdo)
VALUES
(1,23.23,444.223)
(2,55.23,22.223)
..
(900,22.23,11.2)

wobei id ein KEY aber kein Primärkey ist

Gibt es auch eine adequate Möglichkeit in dieser Form einen UPDATE - Befehl einzusetzen, quasi also einen MULTI-UPDATE?

viele grüße
Hans

  1. echo $begrüßung;

    Gibt es auch eine adequate Möglichkeit in dieser Form einen UPDATE - Befehl einzusetzen, quasi also einen MULTI-UPDATE?

    Jein. Ein UPDATE wirkt auf alle Zeilen und wenn eine WHERE-Bedingung angegeben ist, auf die Zeilen, auf die diese Bedingung zutrifft.
    Es gibt allerdings für UPDATE die Multi-Table-Syntax, mit der man die einzelnen Datensätze einer Tabelle über JOIN-Bedingungen mit denen einer anderen Tabelle verbinden kann und dann Werte übertragen kann. Diese Join-Tabelle kann auch eine temporäre Tabelle sein.

    echo "$verabschiedung $name";

    1. Hallo,

      UPDATE die »» Multi-Table-Syntax, mit der man die einzelnen Datensätze einer Tabelle über »» JOIN-Bedingungen mit denen einer anderen Tabelle verbinden kann und dann »» Werte übertragen kann. Diese Join-Tabelle kann auch eine temporäre Tabelle sein.

      danke, das klingt gut. Würdest du dieses Vorgehen im Falle sinnvoll halten, im Falle von ca. 1000 Zeilen, die zu updaten wären. Also konkret, ist es sinnvoller, mit oben genannter Technik zu arbeiten, als 1000 mal einen Single-Update durchzuführen?

      Viele Grüße
      Hans

      1. echo $begrüßung;

        Würdest du dieses Vorgehen im Falle sinnvoll halten, im Falle von ca. 1000 Zeilen, die zu updaten wären. Also konkret, ist es sinnvoller, mit oben genannter Technik zu arbeiten, als 1000 mal einen Single-Update durchzuführen?

        Die Anzahl wird weniger ein Kriterium sein, noch dazu bei dem nicht so hohen Wert. Die Frage ist eher, wo kommen die Werte her und in welcher Form liegen sie vor. Es gibt auch beim INSERT noch einige Möglichkeiten, beispielsweise ON DUPLICATE KEY UPDATE und das REPLACE-Statement.

        echo "$verabschiedung $name";

        1. Hallo

          Die Anzahl wird weniger ein Kriterium sein, noch dazu bei dem nicht so »»hohen Wert. Die Frage ist eher, wo kommen die Werte her und in welcher Form »»liegen sie vor.

          die Daten werden aus XML-Dateien geparst. Diese Daten sollen dann in eine Datenbank geschoben werden. Ist der entsprechende Eintrag in dieser DB schon enthalten (bzw. ID), soll ein UPDATE durchgeführt werden.

          Ich muss nun also bei jeder ID prüfen, ob sie schon in der DB drin ist. Wenn Ja, dann UPDATE, wenn Nein, dann INSERT.

          »»Es gibt auch beim »»INSERT noch »»einige Möglichkeiten, beispielsweise ON DUPLICATE KEY UPDATE und das »»REPLACE-Statement.

          Habe ich mir schon genauer angeguckt, und wäre genau das, was ich benötige. Problem aber hier, dass ich keinen eindeutigen Key in der Datenbank habe. An der Struktur der DB darf ich nichts ändern.

        2. dedlfix, ich habe nochmal eine dumme Frage:

          Meine Tabelle planet:

          id|name1|name2
          1 "erde", "mond"
          2 "sonne", "mars"
          3 "merkur", "jupiter"
          ..
          100 "sonne", "mars"

          Nun eröffne ich mit create temp table eine neue Tabelle planet_temp

          id|name1|name2
          1 "erde", "sonne"
          3 "sonne", "merkur"

          und mache dann mit der Multi-Table-Funktion einen UPDATE

            
          UPDATE planet,planet_temp SET  
          planet.name1=planet_temp.name1,  
          planet.name2=planet_temp.name2  
          WHERE planet.id=planet_temp.id;  
          
          

          Wozu brauche ich dann genau ein JOIN-Statement? Nur wenn ich beide Tabelle abgleichen will?

          Gruss
          Hans

          1. echo $begrüßung;

            UPDATE planet,planet_temp SET

            planet.name1=planet_temp.name1,
            planet.name2=planet_temp.name2
            WHERE planet.id=planet_temp.id;

            
            >   
            > Wozu brauche ich dann genau ein JOIN-Statement? Nur wenn ich beide Tabelle abgleichen will?  
              
            Diese WHERE-Bedingung ist bereits ein implizites JOIN. Ein JOIN legt fest, in welcher Beziehung die Datensätze der einen Tabelle zu denen der anderen Tabelle stehen. In deinem Fall wird die Beziehung über eine gleiche id hergestellt.  
              
              
            echo "$verabschiedung $name";
            
          2. Moin!

            Wozu brauche ich dann genau ein JOIN-Statement? Nur wenn ich beide Tabelle abgleichen will?

            Ich frage mich ja gerade, was du überhaupt erreichen willst mit dem ganzen Zeugs.

            Wenn's dir um den Hauch von Performance beim UPDATE geht: Nimm Prepared Statements. Das gilt übrigens dann analog auch für das INSERT.

            - Sven Rautenberg

            1. Ich frage mich ja gerade, was du überhaupt erreichen willst mit dem ganzen Zeugs.

              Wenn's dir um den Hauch von Performance beim UPDATE geht: Nimm Prepared Statements. Das gilt übrigens dann analog auch für das INSERT.

              Danke Sven, das hört sich spitze an. Spart man sich den ganzen Mumpitz mit den Multi-Insert und Updates.

              Gruss
              Hans