SELECT LAST_INSERT_ID()

时间:2012-04-24 08:11:14

标签: java mysql sql mybatis last-insert-id

有人可以解释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

6 个答案:

答案 0 :(得分: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
  4. 您在同一个语句中插入多行(LAST_INSERT_ID()将返回插入的第一行的值,而不是最后一行的值。

答案 1 :(得分:5)

LAST_INSERT_ID()

是按用户和每个连接。

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

答案 2 :(得分:0)

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

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

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

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

  1. 确保以整数形式读取结果。 This显示了一个需要显式转换为Int32的类似案例。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

示例1:

var topFolders = app.activeDocument.layerSets.length; //how many folders
var todayFolder = layerSetID(topFolders-1); //totally made up layerSetID()
app.activeDocument.activeLayer = todayFolder; //make folder active

答案 5 :(得分:-1)

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

示例:

SELECT LAST_INSERT_ID() FROM my_table;