sql - 没有间隙的 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 列值是否保证是连续的(即没有间隙)?
我的猜测仍然是“不”,但我很想错。
解决方案
在应用程序中管理 id 的开销将比让你的 sql 引擎处理它更昂贵。
对于您的查询,只要您在该列上有适当的索引,就不会有明显的性能差异。但是第二个查询可能会稍微快一些,因为它只需要检查一个条件。