我正在尝试创建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上设置)
答案 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");
}