-1

我正在尝试创建 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()),?,?)

我想获取在消息表中创建的新 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 应该可以工作,但我猜有一些警告。我不知道这些警告是什么。(是的,在 ROWID 上设置了 AI)

4

2 回答 2

1

您不应该SELECTVALUES子句中那样调用。

正确的说法很简单,直接调用函数即可:

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

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

于 2013-06-26T17:53:35.767 回答
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");
}
于 2013-06-26T21:18:11.630 回答