LAST_INSERT_ID()和mysql_insert_id()的问题

时间:2013-06-26 17:50:12

标签: java mysql sql jdbc

我正在尝试创建2个MySQL语句,这些语句将在一个列中插入一个新行并在另一个列中引用该行,如下所示:

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

我想获取在messages表中创建的新ROWID值,并将其插入到messagelog表中。

我发现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 个答案:

答案 0 :(得分:1)

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

正确的陈述很简单,你只需直接调用函数:

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

此外,您似乎正在创建一个复合语句,其中包含两个INSERT个查询。您需要按顺序执行这些操作。 LAST_INSERT_ID()特定于您的连接,因此请确保您的数据库层不会在独立连接上执行这两个调用。

答案 1 :(得分: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");
}