2010-03-12 32 views
5

J'utilise Java, Spring (NamedParameterJdbcTemplate) et MySQL. Ma déclaration ressemble à ceci:Comment insérer dans deux tables différentes dans une déclaration avec Java et MySQL?

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

Mais il jette l'erreur suivante:

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

exception nichés sont:

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 syntaxe fonctionne bien dans MySQL mais quelque chose est en place lors de la combinaison via le modèle Spring.

Merci!

Répondre

0

Vous devez exécuter chaque instruction séparément. En premier lieu, insérer dans Table1, puis insérer dans table_2

+1

Non, je ne le fais pas! Je veux les faire par lots, j'ai 100.000 insertions à faire, c'est pourquoi je dois le faire dans une déclaration – MalcomTucker

5

Utilisez la méthode addBatch pour exécuter plusieurs instructions

 

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

Le pilote JDBC MySQL ne supporte pas plusieurs instructions séparées par ';', même si le client MySQL lui-même le fait. Vous ne pouvez pas compter sur cela si vous devez le faire avec Java.

Si vous avez des enregistrements 100K, êtes-vous sûr que Java est le bon outil pour le travail? Je me demande si les outils d'importation MySQL ou ETL seraient mieux si c'est un travail par lots.

En outre, qu'en est-il du module batch de Spring? A-t-il quelque chose spécialement conçu pour ce problème?

+0

ok, donc c'est la réponse que j'ai été après (ou non, mais il a répondu à ma question!). le problème que j'ai est d'obtenir l'id inséré de la première table pour l'insertion suivante. pour le moment, je dois en exécuter un à la fois - y a-t-il une technique pour le dosage de deux insertions connexes comme celle-ci? – MalcomTucker

+0

Essayez de regarder java.sql.Statement.getGeneratedKeys.Ce sera INSERT, getGeneratedKeys, INSERT dans une unité de travail. Assurez-vous de le faire en une seule transaction. Vous savez comment faire des transactions, n'est-ce pas? – duffymo

+0

Ouais pas de problème - puis-je les retourner en vrac si? – MalcomTucker

0

avez-vous manqué le point-virgule; dans la deuxième déclaration. Je pense que c'est une erreur de syntaxe que toute autre chose. Essayer de lancer deux commandes sur la console mysql et se si la syntaxe est correcte.

Je cours toujours le coomand sur la console pour m'assurer le sytax.

3

Pour tous ceux qui veulent exécuter plusieurs instructions de JdbcTemplate avec MySQL sans utiliser la mise à jour batch: « ? AllowMultiQueries = true »

Ajouter à la fin de l'URL (voir exemple ci-dessous).

<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> 

Testé avec la méthode jdbcTemplate.execute, Spring 3.0.2 et pilote MySQL v5.1.9

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