2012-04-24 63 views
4

有人可以解释MySQL函数LAST_INSERT_ID()是如何工作的。我试图获取数据库中最后插入的行的ID,但每次都得到1.SELECT LAST_INSERT_ID()

我使用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 
+1

是您的ID定义为'autoincrement'? – j0k 2012-04-24 08:20:06

+1

id是自动增量 – Staba 2012-04-24 08:23:02

+0

它也可能是[id在对象中注入](http://stackoverflow.com/a/12106243/1504300)类似发生在我身上的情况,又名“你读得不好文档“。 – reallynice 2017-01-04 13:14:33

回答

5
LAST_INSERT_ID() 

是每个用户和每个连接。

你可以在MySQL doc了解更多。

+1

+1为每个用户提供和每个连接 – DonBecker 2013-03-21 18:22:54

8

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. 您在另一个会话
  3. 您插入在同一个语句多行调用LAST_INSERT_ID明确的值(LAST_INSERT_ID()会返回插入的第一行的值,而不是最后一行)。
+0

也许mybatis创建两个会话,我将尝试创建一个查询插入并选择在一个...谢谢 – Staba 2012-04-24 08:39:04

0

我没有使用过MyBatis的,但你的东西插入到表后,请检查AUTO_INCREMENT值被以下MySQL查询更新时间:

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

另外,还要确保你有没有明确的价值,你给auto_increment字段。你需要让DB为自己设置它。

这里有一些其他的东西,你可以尝试:

  1. 请务必阅读的结果为整数。 This显示了一个类似的情况,需要显式转换为Int32。

  2. 如果你正在做多个插入,知道只有第一个插入的元组的ID被视为LAST_INSERT_ID。根据this(搜索use test)。

0

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

-1

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

例子:

SELECT LAST_INSERT_ID() FROM my_table; 
+1

这只会调用LAST_INSERT_ID()每一行my_table – Braiba 2012-12-07 14:12:09

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!!!