SELECT LAST_INSERT_ID()

有人可以解释MySQL函数LAST_INSERT_ID()的工作原理。 我想在数据库中获取最后一行插入的id,但每次都得到1。

我用mybatis。

示例查询是:

 INSERT INTO something (something) VALUES (#{something})  SELECT LAST_INSERT_ID()   

码:

 System.out.println("Id : " + id) 

输出:

 Id : 1 

LAST_INSERT_ID返回隐式插入当前会话的AUTO_INCREMENT列的最后一个值。

 CREATE TABLE mytable (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, value INT NOT NULL); 

要使列自动增量,您应该从INSERT列表中省略它:

 INSERT INTO mytable (value) VALUES (1) 

或者为它提供NULL值:

 INSERT INTO mytable (id, value) VALUES (NULL, 1) 

之后,

 SELECT LAST_INSERT_ID() 

将返回AUTO_INCREMENT已插入id列的值。

如果符合以下条件,则无效

  1. 您为AUTO_INCREMENT列提供显式值
  2. 您在另一个会话中调用LAST_INSERT_ID
  3. 您在同一语句中插入多行( LAST_INSERT_ID()将返回插入的第一行的值,而不是最后一行的值)。
 LAST_INSERT_ID() 

是按用户和每个连接。

您可以在MySQL doc中阅读更多内容。

我还没有使用MyBatis,但是在向表中插入内容之后,请使用以下MySQL查询检查auto_increment值是否正在更新:

 SELECT Auto_increment FROM (SHOW TABLE STATUS LIKE '') as A; 

还要确保您没有给auto_increment字段赋予明确的值。 您需要让DB为自己设置它。

以下是您可以尝试的其他一些事项:

  1. 确保以整数forms读取结果。 这显示了一个需要显式转换为Int32的类似情况。

  2. 如果您正在进行多次插入,请知道只将第一个插入的元组的ID视为LAST_INSERT_ID 。 根据这个 (搜索use test )。

我有两个解决方案,在实现了很复杂之后我发现了第二个…我会告诉你第二个哪个更好…这很简单…只是在查询中插入这个keyProperty="id"像这样: INSERT INTO something (something) VALUES (#{something}) 查询返回插入行的id谢谢!

例1:

 mysql> CREATE TABLE prime2 LIKE prime; Query OK, 0 rows affected (0.08 sec) mysql> SELECT LAST_INSERT_ID(); //From table prime!!! +------------------+ | LAST_INSERT_ID() | +------------------+ | 3 | +------------------+ 1 row in set (0.00 sec) mysql> INSERT INTO prime2 VALUES(1,1); Query OK, 1 row affected (0.01 sec) mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 3 | +------------------+ 1 row in set (0.00 sec) //From table prime!!! 

您必须使用表名来选择最后一个插入ID。

例:

 SELECT LAST_INSERT_ID() FROM my_table;