MySQL:在没有 auto_increment 的情况下获取最后插入的主键

Posted

技术标签:

【中文标题】MySQL:在没有 auto_increment 的情况下获取最后插入的主键【英文标题】:MySQL: Get last inserted primary key without auto_increment 【发布时间】:2018-11-26 12:02:06 【问题描述】:

我在使用唯一哈希作为主键时删除了我的记录 ID。这个主键显然不能自动递增。

现在我的问题是如何检索最后插入的主键? mysqlLAST_INSERT_ID() 上返回 0,但它不是自动递增列。

【问题讨论】:

【参考方案1】:

事实

没有等价于 LAST_INSERT_ID() 返回非整数值。

可以很简单

    简单的方法

添加一个可以自动递增或非自动递增的整数列。

要让它正确地自动递增,至少必须在 MySQL 本身中实现一种算法,或者使用他们选择的语言来用新的 ID 填充现有记录。

    更复杂的方法

https://***.com/a/53481729/2323764 (@kellymandem)

添加第二个表来管理 ID 并由没有 ID 的源表触发。

不能

我发现这个很有希望的问答。

Is there a way to get last inserted id of a NON - auto incremented column in MySQL?

那里已经提到在INSERT 语句中使用LAST_INSERT_ID()

但是

INSERT INTO `table` ( `non_integer_column` ) VALUES ( LAST_INSERT_ID( 42 ) );
SELECT LAST_INSERT_ID( );
-> 42
INSERT INTO `table` ( `non_integer_column` ) VALUES ( LAST_INSERT_ID( 'a0b1c2d3e4f5' ) );
SELECT LAST_INSERT_ID( );
-> 0

将忽略非整数值。

【讨论】:

【参考方案2】:

我认为您的问题最好通过创建一个新表和一个触发器来跟踪主表中新插入的哈希值来解决。

例如

CREATE TABLE test_table (
    hash VARCHAR(30) NOT NULL PRIMARY KEY,
    fullname VARCHAR(120) NOT NULL
);

CREATE TABLE hash_tracker(
    hash VARCHAR(30) NOT NULL,
    created_at DATETIME NOT NULL
);

DELIMITER $$

CREATE TRIGGER `test_trigger`
AFTER INSERT ON `test_table`
FOR EACH ROW
BEGIN
    INSERT INTO hash_tracker VALUES (NEW.`hash`, NOW());
END$$

DELIMITER ;

然后在我的test_table 上每次插入后,我可以运行以下查询

SELECT hash FROM hash_tracker ORDER BY created_at DESC LIMIT 1;

获取最近插入的哈希。

【讨论】:

更改表并添加时间戳列会短得多。您有理由添加第二张桌子吗? @codekandis 我想我选择了更复杂的方法,但我想你是对的

以上是关于MySQL:在没有 auto_increment 的情况下获取最后插入的主键的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 MySQL 中 auto_increment ID 列的碎片

MySQL auto_increment的坑

在 mysql 表 auto_increment 中创建一个 ID(事后)

MySQL查询和修改auto_increment的方法

MySQL查询数据表的Auto_Increment(自增id)

如何在 MySQL 中重置 AUTO_INCREMENT