SQL: mehrere updates in einem query

Dieses Thema im Forum "Webentwicklung" wurde erstellt von teh_boiiingerrr, 5. September 2007 .

Schlagworte:
  1. 5. September 2007
    servus,
    ich habe hier mehrere datensätze (zwischen 30 und x) mit id und 2 werten. in einem formular werden diese werte eingetragen und abgeschickt.

    sql-mäßig kommt sowas dabei raus:
    Code:
    UPDATE blubb SET wert1='". $muh ,"', wert2='". $meh ."' WHERE id='". $id ."'
    
    für jeden einzelnen datensatz ein update-statement zu bauen ist allerdings doof und unhübsch. gibt's 'ne möglichkeit, mehrere updates in einem mysql_query unterzubringen?
     
  2. 5. September 2007
    AW: SQL: mehrere updates in einem query

    Hi Boing,

    also du denkst dran wie doppelte Anführungszeichen in Kombination mit Variablen genutzt werden können? Machst dir mehr Arbeit als nötig und/oder arbeitest syntaktisch nicht korrekt!

    Zum Anderen möchte ich dir einfach nur einen Tipp geben, und zwar wäre das zum einen die MySQL Doku zu "UPDATE" und zum anderen gibt es dier Möglichkeit über phpmyadmin mehrere Datensätze zu bearbeiten und des zeigt dir danach den query an ... testen und selbst herausfinden
     
  3. 5. September 2007
    AW: SQL: mehrere updates in einem query

    alte angewohnheit seh da keine nachteile.

    hab ich da was übersehen?

    auf die idee kam ich auch schon, aber der versuch, die sql-statements per semikolon zu trennen, schlug fehl.
     
  4. 5. September 2007
    AW: SQL: mehrere updates in einem query

    Nein übersehen hast du bei der Doku effektiv nichts. EBEN

    In Verbindung mit der phpmyadmin Ausgabe, welche dir zwei durch ein Strichkomma getrennte Queries zeigt, hätte dir ja ein Lichtchen aufgehen können.
    Es gibt anscheinend keine Möglichkeit bei MySQL wie z.B. beim Insert Query mehrere "Queries" in einem zusammen zu fassen und da die mysql_query - Funktion anscheinend sowas auch nicht mag, musst du die Updates wohl leider seperat abschicken.
    Workarounds und Tipps zu sowas findeste aber auch z.B. unter php.net/mysql_query
     
  5. 11. September 2007
    AW: SQL: mehrere updates in einem query

    machst du noch ein hidden feld dazu oder so im formular und speicherst darin wert1 also den namen der zeile und speicherst das alles in ein array oder so und trägst dann den inhalt des arrays durch eine foreach schleife in die datenbank ein
     
  6. 11. September 2007
    AW: SQL: mehrere updates in einem query

    ich weiß nicht wies in mysql ist
    aber in oracle würde das ungefähr so aussehen:

    update ... set ... where id between 1 and 10
    oder
    update ... set ... where id in (1, 2, 5, 27, 70)
     
  7. 12. September 2007
    AW: SQL: mehrere updates in einem query

    Du hast glaube ich die Frage nicht korrekt verstanden, denn deine Antwort beantwortet nicht im Ansatz die eindeutige Frage des Threaderstellers.

    @ndreisg ... dies ist nur einfache WHERE - Klausel und imho auch nicht wirklich die Antwort auf die Frage.
     
  8. 12. September 2007
    AW: SQL: mehrere updates in einem query

    eben ein wenig probiert, aber das wird auch nicht 100%ig das sein was du suchst.

    PHP:
    <? php
        $db
    -> query ( "
            UPDATE 
                table1,
                table2 
            SET 
                table1.feld2 = 'aa',
                table2.feld1 = 'bb' 
            WHERE 
                table1.feld1 = 1 
            AND 
                table2.id = 2 
        "
    );
    ?>    
    vorher

    table1:
    Code:
    | feld1 | feld2 |
    --------------------------
    | 1 | bbbbb |
    --------------------------
    
    table2
    Code:
    | id | feld2 |
    --------------------------
    | 1 | asdf |
    --------------------------
    | 2 | blub |
    --------------------------
    
    nacher

    table1:
    Code:
    | feld1 | feld2 |
    --------------------------
    | 1 | aa |
    --------------------------
    
    table2:
    Code:
    | id | feld2 |
    --------------------------
    | 1 | asdf |
    --------------------------
    | 2 | bb |
    --------------------------
    
     
  9. 12. September 2007
    AW: SQL: mehrere updates in einem query

    jetzt wo ich mal genauer darüber nachdenke.... hast du wohl recht sry

    aber ich denke b-xXx hat die richtige lösung
    nur das hidden feld wird wohl nicht nötig sein...

    die werte aus dem formular in arrays speichern
    diese arrays in einer for schleife durchlaufen und das update mit den entsprechenden werten ausführen...
     
  10. 12. September 2007
    AW: SQL: mehrere updates in einem query

    bxx hat imho noch weniger Recht oder zumindestens genauso viel Recht wie unseren lezten Postings, weil auch hier die direkte Frage des Threaderstellers nicht beantwortet wird.

    Murdoc...oder so. An Joins im Update-Query hab ich nicht gedacht. Damit wirste glaube ich die beste Möglichkeit getroffen haben wobei ich mich grad über meinen und boings pellkopf wundern muss wenn dass die beste lösung ist. Dein Beispiel ist ja quasi so auch in der Doku aufgeführt die ich Döspaddel oben ja auch schon angeführt habe.
     
  11. 12. September 2007
    AW: SQL: mehrere updates in einem query

    das ist zwar richtig!
    aber der Threadersteller hat auch geschrieben
    und mit for schleife wäre es nicht mehr so doof und unhübsch ^^

    und nachdem man seine direkte frage wohl nicht beantworten kann, da das ganz einfach nicht möglich ist, ist es wohl naheliegend die beste alternative anzubieten

    mit einem join kann man übrigens nur mehrere tabellen gleichzeitig updaten
    aber man kann damit nicht mehrere datensätze in EINER tabelle mit verschiedenen werten befüllen
     
  12. 12. September 2007
    AW: SQL: mehrere updates in einem query

    Hast du Ahnung wovon du sprichst? Queries in einer For-Schleife abzusenden ist nicht anders als das was der Threadersteller versucht zu vermeiden, boing, murdoc, ich und viele anderen haben kein Problem mit Schleifen und Arrays, aber wir wollen in der Schleife lieber einen Query zusammenbauen, der mehrere Datensätze betrifft, als direkt mehrere Queries abzuschicken. Die Problematik des ganzen Threads ist, dass man bei einem Update Befehl z.B. nicht die Möglichkeiten wie bei einem INSERT - Query hat, mehrere Tupel direkt mit einem einfachen Query anzulegen/zu bearbeiten. Du und b-xxx haben effektiv noch nichtmal verstanden worum es ging, was jetzt auch wieder deine Antwort zeigt.
    Die bisher beste Alternative ist die von Murdoc, oder eine Datenbank-Umgebung zu nutzen die multiple Queries in einem Funktionaufruf erlaubt, oder ein DBMS wo mit einem Query mehrere Tupel ohne Join bearbeitet werden können etc ....
    Dies soll kein persönlicher Angriff sein, sondern nur eine kritische Betrachtung deiner Antwort.
     
  13. 12. September 2007
    AW: SQL: mehrere updates in einem query

    Hoi,
    wenn du php5 mit mysqli Erweiterung (und nen MysqlServer ab 4.1 ?) hast, dann sollte dir die Funktion mysqli_multi_query() weiterhelfen. Damit ist es möglich mehere Querys in einem zusammenzufassen, wenn man diese mit ; trennt.

    greetz blackbone

    //edit
    Möglicherweise muss auch multi-results und multi-statements über mysql_options bzw in der my.cnf aktiviert werden. Siehe MySQL :: MySQL 5.1 Referenzhandbuch :: 24.2.3.48 mysql_options()
     
  14. 12. September 2007
    AW: SQL: mehrere updates in einem query

    achja? danke für die information! ich weiß aber schon worums geht!
    wenn du in einer forschleife eine query zusammenbaust hast du im php code auch nur EINE query
    es werden halt mehrere querys ausgeführt aber anders ist es nun mal nicht möglich
    wenn du die querys mit ; trennst ists auch nicht anders, da werden auch mehrere ausgeführt und es ist unschöner als eine schleife

    die alternative von murdoc ist imo nicht besser als alle anderen, da es sich nicht um mehrere tabellen sondern um genau EINE tabelle handelt! und das ist mit einem join auch nicht lösbar!

    dies soll kein persönlicher Angriff sein, sondern nur eine kritische Betrachtung deiner Fähigkeit meine Antwort zu lesen ^^
     
  15. 12. September 2007
    AW: SQL: mehrere updates in einem query

    Es geht darum nur einmal eine Verbindung zum mysql Server aufzubauen und nicht für jedes update Query eine und insofern nützt deine Variante nicht viel. Bzw auf einmal alles zusenden und nicht 30 mal nur eines.

    greetz blackbone
     
  16. 12. September 2007
    AW: SQL: mehrere updates in einem query

    Jo mit PHP5 hast du wahrscheinlich Recht, die C-Referenz von MySQL zu zitieren bringt aber leider glaube ich nichts, weil auf php.net eindeutig steht dass die Standardfunktion der mysql - api keine multiplen queries unterstützt, da eindeutige ressource identifier zurückgegeben werden.

    Es sind immer noch mehrere Queries. Nur weil ich die Augen zu mache, ist mein Computer physisch nicht verschwunden weil ich ihn nichtmehrt sehe.

    ...

    Soweit waren wir auch ohne dein Posting, was somit eigentlich zu Spam geworden ist.

    Richtig und wir haben eine Lösung gesucht, wie bereits oben boing, Murdoc und mir dargestellt, ähnlich dem Insert - Query, mehrere Tupel mit einem Query zu bearbeiten.

    Ähm? Schonmal etwas von einem self-join gehört? Aber das es nicht so schön geht wie z.B. bei einem Insert habe ich schon deutlich früher gesagt und den Rest kann jeder von uns....

    LOL, o mann
     
  17. 12. September 2007
    AW: SQL: mehrere updates in einem query

    und wenn man vor der schleife verbindet, und nach der schleife die verbindung wieder trennt???
    dann hat man imo nur einmal verbunden für alle querys die in der schleife ausgeführt werden ^^
    und ob du nun die querys mit strichpunkt trennst oder sie nacheinander ausführst... das ist und bleibt das selbe
    ob du ins SQL*Plus eine query nach der anderen rein kopierst und ausführst oder alle gleichzeitig macht auch keinen unterschied
     
  18. 12. September 2007
    AW: SQL: mehrere updates in einem query

    Wir reden immernoch von Queries und nicht Verbindungen, leider kann diese Rüge auch an blackbone gehen, weil er sich falsch ausdrückte. Wer es schafft, sich mehrmals mit sql-server zu verbinden, ist selber schuld.

    Es bleibt leider nicht das selbe, wenn die PHP - Standardfunktion keine multiplen Queries in der von dir zitierten Form unterstützt. Zumal dieser Vorschlag auch nichtmehr neu ist.
     
  19. 12. September 2007
    AW: SQL: mehrere updates in einem query

    das versteh ich jetzt nicht... ich hab den vorschlag mit den ; nicht gemacht! und die trennung durch ; würde performance mäßig keinen vorteil bringen und noch dazu wäre der code hässlich!

    ich verstehe nicht was ich hier noch großartig herum diskuttiere...
    mehrere datensätze in einem update mit verschiedenen werten zu befüllen funktioniert nicht
    join bringt nichts
    trennung durch ; bringt nichts

    wahrscheinlich hat der threadstarter sein problem schon lange mit einer for schleife gelöst ^^
    also vielen dank für die nette konversation! ich verzieh mich jetzt aus diesem thread und wünsch euch noch viel spaß beim finden der lösung die nicht existiert
     
  20. 12. September 2007
    AW: SQL: mehrere updates in einem query

    Die Referenz hatte ich nur verlinkt um aufzuzeigen wo bzw wie ggf die my.cnf angepasst werden muss.

    Es macht sehr wohl einen Unterschied ob 30 mal mysql_query() aufgerufen wird oder nur einmal. (Das ließe sich sicher auch performancetechnisch messen, besonderns bei einem externem Datenbankserver.) Außerdem gefällt mir (subjektiv) der Stil besser alles auf einmal rauszudrücken. (Mal abgesehen davon, dass der Threadersteller genau (/nur) danach gefragt hat.)

    Dass das Ergebnis der Verfahren gleich ist, streitet niemand ab.

    ---

    Achja, logischerweise wird nur eine Verbindung zum Server aufgebaut.. Ich bitte hochoffiziell um Entschuldigung für meine ungelenke Ausdrucksweise.

    greetz blackbone
     
  21. 12. September 2007
    AW: SQL: mehrere updates in einem query

    O Mann ...


    boing ... bitte Murdocs Lösungen testen, jedoch mit einem self join.
    beispielsweise so .. (funktioniert bei mir ohne Probleme mit mysql_query() gewrappt)

    PHP:
    UPDATE rt_kunden k1
           
    rt_kunden k2 
    SET    k1
    . kunde_name  'test 278'
           
    k2 . kunde_name  'test 279' 
    WHERE  k1 . id_kunde    278 
    AND     k2 . id_kunde    279
     
  22. 12. September 2007
    AW: SQL: mehrere updates in einem query

    http://www.java2s.com/Code/SQL/Join/Selfjoin.htm @ ndreisg
    Code:
    UPDATE 
     table1 AS t1, 
     table1 AS t2, 
     table1 AS t3
    SET
     t1.field1 = 'a',
     t2.field1 = 'b',
     t3.field1 = 'c'
    WHERE
     t1.id = 1
    AND
     t2.id = 2
    AND
     t3.id = 3
    
    nur ob das geht is fraglich^^ auf alle fälle wäre das ein selfjoin
    //makenx war schneller
     
  23. 12. September 2007
    AW: SQL: mehrere updates in einem query

    Jo das "AS" Statement macht bei mysql anscheinend Probleme, aber nun ja, ich würde zu der Diskussion damit gerne noch mehr sagen, aber ich verkneif es mir einfach mal. Jedoch muss man bedenken, dass so ein self-join auch durchaus mehr Performance fressen kann und man sich seine komplette Datensätze schrotten kann, wenn man z.B. die Where-Clause nicht richtig setzt oder die Version Stunk macht oder wie auch immer ....
    PS getestet habe ich es mit der letzten PHP4 - Version und nem "alten" mysq 4 - Server.
     
  24. 13. September 2007
    AW: SQL: mehrere updates in einem query

    schön, wie man immer diskussionen entfachen kann

    ich hab gerade mal ne kleine messung gemacht und mir beide varianten mit einer tabelle (id, feld1, feld2, feld3) angeschaut:
    1) 100 x 100 updates (d.h. 100 x 100 queries)
    PHP:
    for( $j = 0 $j < 100 $j ++) {
        
    $timer  = new  c_Timer ();
        
    $timer -> start ();
        for(
    $i = 1 $i <= 100 $i ++) {
            
    $sql  "UPDATE multi_updates SET feld1=" rand ( 0 100 ) . ", feld2=" rand ( 0 100 ) . ", feld3=" rand ( 0 100 ) . " WHERE id=" $i ;
            
    mysql_query ( $sql );
        }
        
    $timer -> stop ();
        
    array_push ( $time $timer -> elapsed ());
    }
    2) 10 x 100 updates durch selfjoin (ja, nur 10, ihr seht unten, warum)
    PHP:
    for( $j = 0 $j < 10 $j ++) {
        
    $timer_loop  = new  c_Timer ();
        
    $timer_loop -> start ();
        
    $sql_a  $sql_v  $sql_w  "" ;
        for(
    $i = 1 $i < 100 $i ++) {
            
    $sql_a .=  "multi_updates AS t" $i  . ", " ;
            
    $sql_v .=  "t" $i  . ".feld1=" rand ( 0 100 ) . ", t" $i  . ".feld2=" rand ( 0 100 ) . ", t" $i  . ".feld3=" rand ( 0 100 ) . ", " ;
            
    $sql_w .=  "t" $i  . ".id=" $i  . " AND " ;
        }
        
    $sql  "UPDATE " $sql_a  . "multi_updates as t100
                SET "
    $sql_v  . "t100.feld1=" rand ( 0 100 ) . ", t100.feld2=" rand ( 0 100 ) . ", t100.feld3=" rand ( 0 100 ) . "
                WHERE "
    $sql_w  . "t100.id=100" ;
        
    $timer_loop -> stop ();
        
    array_push ( $time_loop $timer_loop -> elapsed ());
        
    $timer_sql  = new  c_Timer ();
        
    $timer_sql -> start ();
        
    mysql_query ( $sql );
        
    $timer_sql -> stop ();
        
    array_push ( $time_sql $timer_sql -> elapsed ());
    }
    ergebnis:
    Code:
    Variante 1, 1 Query pro Schleifendurchlauf
    Mittelwert bei 100 x 100 Updates: 0.012737326622
    
    Variante 2, self-join
    Mittelwert bei 1 x 100 Updates (Schleife): 8.3179473877E-5
    
    Mittelwert bei 1 x 100 Updates (Query): 0.00317650079727
    
    die methode, die ich für das statement benutze, mag nicht optimal sein - aber ich denke nicht, dass sich da viel optimieren lässt. vielleicht fehlt mir auch einfach der kaffee im körper, um sinnvolle gedanken hinzukriegen. es riecht nach battle
     
  25. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.