2013-06-26 44 views
-1

我试图创建在一列和参考插入新行2条MySQL语句的问题是同一行中的另一个,就像这样:与LAST_INSERT_ID()和mysql_insert_id()

如果你需要知道的,我使用的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()); 

所以,可以很清楚的,我的SQL语句是:

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

我想在邮件中创建新的ROWID值表并将其插入到消息日志表中。

我在找LAST_INSERT_ID(), mysql_insert_id()这两个都不起作用。我得到以下异常抛出:

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 

在MySQL的文档,这听起来像LAST_INSERT_ID应该工作,但我猜有警告。我不知道这些警告是什么。 (是A.I设置在ROWID上)

+2

您正在尝试两个SQL查询塞进一个。除非你为连接指定了'allowMultiQuery = true',否则你不能这么做。请参阅:http://stackoverflow.com/questions/10797794/multiple-queries-executed-in-java-in-single-statement –

+0

添加,没有奏效,但似乎要走的路是创建一个存储过程。 –

回答

1

您不应该在VALUES子句中调用SELECT

正确的说法是非常简单的,你只要直接调用该函数:

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

此外,它看起来像你创建两个INSERT查询复合语句合并成一个。您将需要按顺序执行这些操作。 LAST_INSERT_ID()特定于您的连接,因此请确保您的数据库层不会在独立连接上执行这两个调用。

+0

正如我所说的,我在我的测试中尝试了4种组合。但我认为你已经回答了,我需要将它分成两个独立的电话。有没有办法解决这个问题?这两个表是链接的,所以只需要一个调用来处理两个插入即可...... –

+1

@EricS - 而不是担心在同一个调用中执行它们,只是将它们作为单独的调用执行,但在同一个事务中。 –

+0

@EricP,这实际上是一个非常好的主意。我想我想让我的代码在Java端更简单。 –

0

试试这个:

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

嗯,但是这一切都是在一次调用SQL的过程中失败的目的... –