SQL中返回自增键和最后插入ID的区别

Posted

技术标签:

【中文标题】SQL中返回自增键和最后插入ID的区别【英文标题】:Difference between returning auto increment key and last insert ID in SQL 【发布时间】:2021-03-16 11:52:46 【问题描述】:

在我们的代码库中,我们使用两种不同的方式来检索新插入行的自动递增键:

    INSERT ... RETURNING id

    SELECT LAST_INSERT_ID()

其中id 在创建时是INT UNSIGNED NOT NULL AUTO_INCREMENT。两者通常返回相同的值 - 通过使用第一个检查,然后运行第二个,并比较返回的值 - 但除了 RETURNING 可能在多行插入时返回多行的明显区别之外,它允许返回超过只是键列,为了检索插入的自动递增键,它们之间有什么实际区别?

知道这是 MariaDB 中的 InnoDB 表可能很重要。

【问题讨论】:

【参考方案1】:

第一个肯定返回插入行的 id。如果在 INSERTSELECT 之间插入另一行,第二个可能会返回不同行的 id。

【讨论】:

有趣。但是当我对所有插入使用事务时,它仍然可能发生吗?我立即致电LAST_INSERT_ID - 或者更好的是,我使用驱动程序库来执行此操作(我相信它会在每次查询时自动调用),会发生吗?【参考方案2】:

INSERT . . . RETURNING 更加灵活:

如果您愿意,它会返回多个表达式,因此您可以从插入的行返回更多的值,而不仅仅是自动递增的 id。 它返回多行。

LAST_INSERT_ID() 真的是为单行插入而设计的,并且只返回一个 id。我推荐使用INSERT . . . RETURNING

【讨论】:

我已经在问题中澄清了多行插入是一个明显的区别【参考方案3】:

在插入多行的情况下,INSERT-RETURNING 将返回所有已插入的 ID,而 LAST_INSERTED_ID() 将仅返回一个

【讨论】:

我已经在问题中澄清了多行插入是一个明显的区别

以上是关于SQL中返回自增键和最后插入ID的区别的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server事务回滚对自增键的影响

MySQL自增键用完后,插入数据会发生什么情况

MySQL事务回滚后自增键不连续

auto_increment 自增键的一些说明

Mysql唯一索引线上故障记录

15. sharding-jdbc中的分布式ID