有没有办法在MySQL中获取NON自动递增列的最后插入ID?

时间:2012-01-05 16:51:17

标签: mysql

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

我有办法做到吗?

8 个答案:

答案 0 :(得分:15)

您可以使用相同的LAST_INSERT_ID()轻松完成此操作。

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

SELECT LAST_INSERT_ID();  -- returns 126

答案 1 :(得分: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

编辑:根据下面的评论,您最好使用AUTO_INCREMENT列,虽然此列不必是id列,但您可以添加自动增量{{1} } insert_order类型的列,只需按此顺序排序。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

没有

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

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

答案 4 :(得分:0)

没有办法使用mysql。但你可以通过编程方式完成它。如果没有自动递增ID列,数据库就无法知道最后插入了哪些记录。

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

答案 5 :(得分:0)

如果要获取自定义的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');

答案 6 :(得分:0)

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

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

SET @id = UUID();

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

SELECT * FROM users WHERE id = @id;

答案 7 :(得分:-1)

这在XAMPP中对我有用

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