2013-06-26 4 views
-1

Je suis en train de créer 2 déclarations MySQL qui insérer une nouvelle ligne dans une colonne et référence la même ligne dans un autre, comme celui-ci:Problèmes avec LAST_INSERT_ID() et mysql_insert_id()

Si vous avez besoin de savoir , J'utilise Java/com.mysql.jdbc.Driver

insertNewMessage = connection 
     .prepareStatement(new StringBuilder(128) 
       .append("INSERT INTO messages (Message,SHA256) VALUES (?,?);") 
       .append("INSERT INTO messagelog (MESSAGE_ID,SERVER_ID,CLIENT_ID) VALUES ((SELECT LAST_INSERT_ID()),?,?)") 
       .toString()); 

il le rendre plus clair, mon instruction SQL est:

INSERT INTO messages (Message,SHA256) VALUES (?,?); 
INSERT INTO messagelog (MESSAGE_ID,SERVER_ID,CLIENT_ID) VALUES ((SELECT LAST_INSERT_ID()),?,?) 

Je veux prendre la nouvelle valeur ROWID créé dans les messages table et insérez-le dans la table messagelog.

Je trouve LAST_INSERT_ID(), mysql_insert_id() ne fonctionnant pas tous les deux. Je reçois l'exception suivante jeté:

Exception in thread "main" 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 messagelog (MESSAGE_ID,SERVER_ID,CLIENT_ID) VALUES ((SELECT LAST_INS' at line 1 

Dans la documentation MYSQL, il semble que LAST_INSERT_ID devrait fonctionner, mais je devine il y a des mises en garde. Je ne sais pas ce que sont ces mises en garde. (Oui A.I est défini sur les ROWID)

+2

Vous essayez de caser deux requêtes SQL en un seul. Vous ne pouvez pas faire cela à moins que vous ayez spécifié 'allowMultiQuery = true' pour la connexion. Voir: http://stackoverflow.com/questions/10797794/multiple-queries-executed-in-java-in-single-statement –

+0

Ajout de cela n'a pas fonctionné, mais il semble que la voie à suivre est la création d'une procédure de magasin . –

Répondre

1

Vous ne devez pas appeler SELECT comme cela dans une clause VALUES.

La déclaration correcte est assez simple, vous appelez simplement la fonction directement:

INSERT INTO messagelog (MESSAGE_ID,SERVER_ID,CLIENT_ID) VALUES (LAST_INSERT_ID(),?,?) 

De plus il semble que vous créez une instruction composée avec deux INSERT requêtes combinées en une seule. Vous devrez les exécuter de manière séquentielle. LAST_INSERT_ID() est spécifique à votre connexion, assurez-vous que votre couche de base de données n'exécute pas ces deux appels sur des connexions indépendantes.

+0

Comme je l'ai dit, j'ai essayé 4 combinaisons dans mes tests. Mais je pense que vous avez répondu, je dois séparer cela en deux appels distincts. Y a-t-il un moyen de contourner cela? Ces deux tables sont liées, donc ce serait sympa d'avoir un seul appel pour gérer les deux insertions ... –

+1

@EricS - plutôt que de vous soucier de les faire dans le même appel, faites-les tous les deux comme des appels séparés mais dans la même transaction . –

+0

@EricP, c'est une très bonne idée en fait. Je suppose que je voulais rendre mon code plus simple sur Java. –

0

essayez ceci:

connection.createStatement().executeUpdate("INSERT INTO blablabla"); 
ResultSet rs = connection.createStatement().executeQuery("select last_insert_id() as mID"); 
if(rs.next()){ 
    connection.createStatement().executeUpdate(
    "INSERT INTO blablabla VALUES(" + rs.getString("mID") + ",blablabla"); 
} 
+0

Eh bien oui, mais cela va à l'encontre du but de tout faire en un seul appel à SQL ... –

Questions connexes