首页 > 解决方案 > 没有间隙的 SQL 自动增量——解决方法/最佳实践

问题描述

我的应用程序需要一个具有自动增量主键列且没有间隙的表。正如其他人所指出的那样,AUTOINCREMENT 实现通常会导致间隙(txn 回滚、删除等)。没有间隙的自动增量在应用程序层很容易实现,但我想知道是否有更好的(更多 SQL'ish)方法来解决这个问题。

我更喜欢没有间隙的原因是因为我想象形式的范围查询

SELECT * 
FROM chainTable 
WHERE chn_id >= 10005003 AND chn_id <= 10005009

比表单查询快

SELECT * 
FROM chainTable 
WHERE chn_id >= 10005003 
ORDER BY chn_id 
LIMIT 7

在我的应用程序中,选定的行是在同一个事务中创建的。因此,我对没有差距的需求可以放宽到在同一交易中产生的价值。所以我的问题归结为:

事务中生成的AUTOINCREMENT 列值是否保证是连续的(即没有间隙)?

我的猜测仍然是“不”,但我很想错。

标签: sqlauto-increment

解决方案


在应用程序中管理 id 的开销将比让你的 sql 引擎处理它更昂贵。

对于您的查询,只要您在该列上有适当的索引,就不会有明显的性能差异。但是第二个查询可能会稍微快一些,因为它只需要检查一个条件。


推荐阅读