【问题标题】:SELECT LAST_INSERT_ID()选择 LAST_INSERT_ID()
【发布时间】:2012-05-04 20:47:10
【问题描述】:

谁能解释一下 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

【问题讨论】:

  • 你的 id 定义为autoincrement 吗?
  • 也可能是The id is injected in the object 的案例,就像发生在我身上的案例一样,也就是“您没有仔细阅读文档”。

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


【解决方案1】:
LAST_INSERT_ID()

每个用户和每个连接。

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

【讨论】:

  • @Silviu 在连接池中安全吗?我看到有人说last_insert_id在连接池中有问题,因为相同的连接可以在连接池中重复使用。
【解决方案2】:

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() 将返回插入的第一行的值,而不是最后一行)。

【讨论】:

  • 也许 mybatis 创建了两个会话,我会尝试创建一个查询以插入和选择一个...谢谢
【解决方案3】:

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

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

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

您可以尝试以下其他方法:

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

  2. 如果您要进行多次插入,请注意只有第一个插入的元组的 ID 被视为 LAST_INSERT_ID。根据this(搜索use test)。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      例子:

      SELECT LAST_INSERT_ID() FROM my_table;
      

      【讨论】:

      • 这只会为 my_table 中的每一行调用 LAST_INSERT_ID() 一次
      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-30
        • 1970-01-01
        • 2015-04-23
        • 1970-01-01
        • 2011-04-19
        • 2013-01-27
        相关资源
        最近更新 更多