2010-03-12 48 views
5

Estoy usando Java, Spring (NamedParameterJdbcTemplate) y MySQL. Mi declaración es el siguiente:¿Cómo insertar en dos tablas diferentes en una declaración con Java y MySQL?

INSERT INTO Table1 (Name) VALUES (?);
INSERT INTO Table2 (Path, Table1Id) VALUES (?, LAST_INSERT_ID())

Pero está lanzando el siguiente error:

PreparedStatementCallback; bad SQL grammar [INSERT INTO Table1 (Name) VALUES (?);
INSERT INTO Table2 (Path, Table1Id) VALUES (?, LAST_INSERT_ID())] `

excepción anidada es:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO Table2 (Path, Table1Id' at line 1

La sintaxis funciona bien en MySQL, pero algo está activo cuando se combina a través de la plantilla Spring.

Gracias!

Respuesta

0

Debe ejecutar cada instrucción por separado. En primer lugar, insertar en tabla1, a continuación, insertar en la Tabla2

+1

No, no lo hago! Quiero agruparlos, tengo 100.000 inserciones para hacer, por eso tengo que hacerlo en una declaración – MalcomTucker

5

Utilice el método addBatch para ejecutar varias instrucciones

 

Statement stmt = con.createStatement(); 
    stmt.addBatch(
    "update registration set balance=balance-5.00 
     where theuser="+theuser); 
    stmt.addBatch(
    "insert into auctionitems(
        description, startprice) 
     values("+description+","+startprice+")"); 

    int[] results = stmt.executeBatch(); 
 

source

1

El conductor MySQL JDBC no soporta varias instrucciones separadas por ';', incluso si el cliente MySQL sí mismo. No puede depender de eso si debe hacer esto con Java.

Si tiene 100K registros, ¿está seguro de que Java es la herramienta adecuada para el trabajo? Me pregunto si las herramientas de importación de MySQL o ETL serían mejores si se trata de un trabajo por lotes.

Además, ¿qué pasa con el módulo de lotes Spring? ¿Tiene algo especialmente hecho para este problema?

+0

bien, así que esa es la respuesta que estaba buscando (o no, ¡pero ha respondido mi pregunta!). el problema que tengo es obtener el ID insertado de la primera tabla para la inserción posterior. en este momento tengo que ejecutar uno a la vez. ¿Existe alguna técnica para agrupar dos insertos relacionados como este? – MalcomTucker

+0

Intenta mirar java.sql.Statement.getGeneratedKeys.Será INSERT, getGeneratedKeys, INSERT en una unidad de trabajo. Asegúrate de hacerlo en una sola transacción. Sabes cómo hacer transacciones, ¿verdad? – duffymo

+0

Sí, no hay problema, ¿puedo devolverlos a granel? – MalcomTucker

0

echas de menos el punto y coma; en la segunda declaración. Creo que este es un error de sintaxis que cualquier otra cosa.

tratando de ejecutar allí dos comandos en la consola mysql y se si la sintaxis es correcta.

Siempre ejecuto el coomand en la consola para asegurarme de que el sytax.

3

Para cualquier persona que quiera ejecutar múltiples sentencias de JdbcTemplate con MySQL sin usar actualización por lotes: "? AllowMultiQueries = true"

añadir al final de la URL (véase el ejemplo siguiente).

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/tt?allowMultiQueries=true" /> 
    <property name="username" value="root" /> 
    <property name="password" value="" /> 
</bean> 

Probado con el método jdbcTemplate.execute, Primavera 3.0.2 y MySQL v5.1.9 controlador

<dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.9</version> 
    </dependency> 
Cuestiones relacionadas