【问题标题】:Is there a way to get last inserted id of a NON - auto incremented column in MySQL?有没有办法在 MySQL 中获取最后插入的非自动递增列的 id?
【发布时间】:2012-01-05 16:51:16
【问题描述】:

我知道 LAST_INSERT_ID() 如何用于自动递增的列,但我找不到方法来获取我为非自动递增的列插入的最后一个 id。

有什么办法可以做到吗?

【问题讨论】:

  • 如果 ID 不是自动递增的,那么你必须在你的 INSERT 语句中提供它,所以你已经有了它
  • 列没有ID;记录做。如果您想要最后插入记录的其他列,可以使用 LAST_INSERT_ID() 选择它。还是你的意思是别的?
  • @Darhazer:......可能在另一个应用程序中,可能在另一台机器上,可能在另一个国家的另一个网络上......?
  • 顺便说一句,LAST_INSERT_ID() 仅适用于插入记录的会话,它不会从另一个国家的另一个网络返回任何内容:)
  • 你为你的“id”使用什么数据类型,你在其中存储什么值?您也许可以使用SELECT MAX(IdColumn) as LastId FROM table。谁知道? :)

标签: mysql


【解决方案1】:

您可以使用相同的 LAST_INSERT_ID() 轻松做到这一点。

INSERT INTO thetable (id, value)
VALUES (LAST_INSERT_ID(126), 'some data');

SELECT LAST_INSERT_ID();  -- returns 126

【讨论】:

  • Harvesting 给了我这个无价的知识......不得不说,即使是链式选择也可以用来代替那里的 126 =)
  • 这是通过连接持久化的吗?
  • @manatax,它的值在连接中可用,直到您插入新行或更新上述值
  • 太棒了!我会用它!
  • @manatax,其实它主要用在'ON DUPLICATE KEY UPDATE'子句中
【解决方案2】:

我假设您希望在插入后的某个时间点检索最后插入的 id,因为如果您在插入后立即需要它,您显然已经知道该 id 是什么。

唯一的方法是在表中添加另一列来指示上次插入的行,例如时间戳或日期时间列。如果您的 id 是唯一且不断增加的,则可以使用该列。然后,您只需选择按该列降序排列的 1 行。

例如

INSERT INTO my_table (id, timestamp) VALUES (123, NOW())

SELECT id FROM my_table ORDER BY timestamp DESC LIMIT 1

编辑:根据下面的 cmets,您最好使用 AUTO_INCREMENT 列,尽管此列不必是 id 列,您可以添加自动增量 insert_order 类型的列Int 并按此订购。

【讨论】:

  • 适用于 very 小规模应用程序,保证每秒 AUTO_INCREMENT,但方式较差!
  • 请记住,自动递增列是线程安全的。时间戳不是。
  • 你说得对,我正要编辑我的帖子来解释使用 AUTO_INCREMENT 列更好,即使它与 id 不是同一列。
【解决方案3】:

我假设您需要 ID 来查找刚刚插入的行,而不是查找最后插入的行。在 Web 应用程序中,您永远无法确定最后插入的行就是您刚刚创建的行。

在这种情况下,您可以使用 GUID 作为 id。 GUID 通常存储为长度为 36 的字符串或 16 字节的 blob。 GUID 可以在插入行之前创建,然后可以在插入行时存储。

由于 id 没有按照您的说明自动递增,因此您必须在插入行之前生成它。最安全的方法是创建一个足够独特的 GUID。否则您将不得不确定最后一个未使用的 ID,这可能会很棘手且有风险。

【讨论】:

  • 在大多数情况下,这是适用的解决方案。即生成您自己的标识符并将其提供给INSERT 语句
【解决方案4】:

我发现最简单的方法是设置一个变量。

与使用仅返回的 LAST_INSERT_ID 和 INT 不同,您可以使用其他唯一标识符。

SET @id = UUID();

INSERT INTO users (
  id
)
VALUES (
  @id
);

SELECT * FROM users WHERE id = @id;

【讨论】:

    【解决方案5】:

    没有。

    没有内在的关系排序,没有“最后插入的记录”。毕竟,这就是AUTO_INCREMENT 字段存在的原因。

    您必须自己查看日志或在应用程序中缓存该值。

    【讨论】:

      【解决方案6】:

      mysql 没办法。但是您可以以编程方式进行。如果没有自动递增的 ID 列,数据库就无法知道最后插入了哪些记录。

      一种方法是使用包含时间戳或日期时间值的列。并获取 tmestamp 的最新值的 id 以获取最后插入的记录

      【讨论】:

        【解决方案7】:

        如果你想获得一个自定义的 last_inserted ID,你必须实现一个过程来在你的数据库上创建插入语句。 最后,只需打印 ID 并使用 PHP(如果 PHP 是您的主脚本)发送方返回生成的行。

        示例:

        DROP PROCEDURE IF EXISTS insert_row;
        DELIMITER $$
        
        CREATE PROCEDURE insert_row(IN _row_id VARCHAR(255), IN _description VARCHAR(255))
        BEGIN
            SET @last_inserted_id = _row_id;
            SET @sql = CONCAT("INSERT INTO test VALUES ('", _row_id, "','",_description,"')");
            PREPARE stmt FROM @sql;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;
            SELECT @last_inserted_id AS LAST_INSERT_ID;
        END;
        $$
        
        DELIMITER ;
        #
        #
        #
        #------- HOW TO USE IT ? ---------------
        CALL insert_row('Test001','the first test line');
        

        【讨论】:

          【解决方案8】:

          这在 XAMPP 中对我有用

          $qry = $con->query("INSERT INTO test_table(tbl_id, txt) VALUES(last_insert_id('15'), 'test value')");
          print_r($con->insert_id);
          

          【讨论】:

            猜你喜欢
            • 2012-12-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-23
            • 1970-01-01
            • 2022-06-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多