MySQL: mehrere Insert-Statements im gleichen Query

Mischa Sameli, Geschäftsführer & Leiter Entwicklung

Auf eine einfache Methode, mehrere Insert-Statements im selben Query auch mit MySQL durchzuführen, bin nun in einer Kombination aus Zufall und Fehlern gestossen.

Und zwar habe ich versucht, mehere Datensätze gleichzeitig zu importieren und habe aus lauter Gewohnheit die MSSQL-Syntax verwendet:

1<cfquery name="qryInsert" datasource="mysql_test">
2    <cfloop from="1" to="100" index="cnt">
3    INSERT INTO test (cnt)
4    values
5        (<cfqueryparam cfsqltype="cf_sql_integer" value="#cnt#">)
6    </cfloop>
7</cfquery>

Pustekuchen! Fehler! Das geht nicht! Mindestens nicht einfach so. Klar, MySQL unterstützt mehrere SQL-Statements in einer Abfrage nicht ohne weiteres. Also alles rückgängig und nach alter Väter Sitte:

1<cfloop from="1" to="100" index="cnt">
2<cfquery name="qryInsert" datasource="test">
3INSERT INTO test (cnt)
4values
5(<cfqueryparam cfsqltype="cf_sql_integer" value="#cnt#">)
6</cfquery>
7</cfloop>

Das klappt, einfach mit dem Nachteil, dass nun 100 Datenbank-Abfragen erfolgen müssen, was natürlich zu Lasten der Perfomance geht. Bei der Umstellung auf diese Variante hat mir allerdings die Copy-Paste-Methode einen Streich gespielt und aus der ersten Abfrage ist nicht die zweite entstanden sondern:

1<cfquery name="qryInsert" datasource="mysql_test">
2    
3    INSERT INTO test (cnt)
4    values
5<cfloop from="1" to="100" index="cnt">
6        (<cfqueryparam cfsqltype="cf_sql_integer" value="#cnt#">)
7    </cfloop>
8</cfquery>

Das funktioniert natürlich gar nicht, was mir mit einer saftigen Fehlermeldung auch bestätigt wurde. Allerdings war die Fehlermeldung immerhin so aufschlussreich, dass auch ein kleiner Hinweis auf eine mögliche Alternative gezeigt wurde. Und so entstand ohne weiteres Pröbeln folgende Abfrage:

1<cfquery name="qryInsert" datasource="mysql_test">
2    
3    INSERT INTO test (cnt)
4    values
5<cfloop from="1" to="100" index="cnt">
6        (<cfqueryparam cfsqltype="cf_sql_integer" value="#cnt#">)<cfif cnt LT 100>,</cfif>
7    </cfloop>
8</cfquery>

Und siehe da: 1 Abfrage – 100 Inserts. Einfach den Value-Teil loopen und diese mit Kommas abtrennen (das letzte natürlich nicht). Natürlich ist auch hier Vorsicht geboten. Bei grossen Datenmengen führt dies zu einem Fehler.