6

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

我用的是mybatis。

示例查询是:

<insert id="insertInto" parameterType="Something" timeout="0">
  INSERT INTO something (something) VALUES (#{something})
  <selectKey resultType="int">
    SELECT LAST_INSERT_ID()
  </selectKey>
</insert>

代码:

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

输出:

Id : 1
4

6 回答 6

10

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()将返回插入的第一行的值,而不是最后一行)。
于 2012-04-24T08:28:12.230 回答
4
LAST_INSERT_ID()

是每个用户和每个连接。

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

于 2012-04-24T08:24:43.217 回答
0

我还没有使用 MyBatis,但是在你向表中插入一些东西之后,检查 auto_increment 值是否正在使用以下 MySQL 查询进行更新:

SELECT Auto_increment FROM (SHOW TABLE STATUS LIKE '<table-name>') as A;

还要确保您没有为该auto_increment字段提供明确的值。您需要让数据库自行设置。

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

  1. 确保将结果作为整数读取。显示了需要显式转换为 Int32 的类似情况。

  2. 如果您正在执行多次插入,请知道只有第一个插入元组的 ID 被视为LAST_INSERT_ID. 据此搜索use test)。

于 2012-04-24T08:51:09.220 回答
0

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

于 2012-04-24T20:10:16.120 回答
0

示例 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!!!
于 2015-06-12T06:59:38.540 回答
-1

You have to use a Table name to select the last insert id.

Example:

SELECT LAST_INSERT_ID() FROM my_table;
于 2012-08-14T13:20:28.697 回答