首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么模型ID不总是Postgres/Django中的下一个递增号?

为什么模型ID不总是Postgres/Django中的下一个递增号?
EN

Stack Overflow用户
提问于 2016-08-04 10:54:46
回答 1查看 815关注 0票数 4

我在Django中有一个Booking模型,它的ID是Django创建的内置id列。下面是在Postgres中如何看待数据库级别:

代码语言:javascript
运行
复制
integer   not null default nextval('bookings_booking_id_seq'::regclass)

客户今天打电话来,担心这些数字似乎是连续的,但并不总是连续的。例如,顺序如下:

代码语言:javascript
运行
复制
..2, ..3, ..4, ..6, ..8, ..9

他们担心系统正在取消或删除预订。..5..7在哪里?我们记录了几乎所有可以删除预订的内容,所以我很有信心这不是一个系统问题。程序员的直觉也教会了我不要期望自动ID的连续性,但是仅仅凭直觉是不够的,不足以向客户解释。

在分配这些it时,Postgres是否有跳过数字的技术原因?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-04 10:59:46

来自postgres文档

由于小串行、串行和大串行是使用序列实现的,因此可能在列中出现的值序列中存在“漏洞”或空白,即使没有删除任何行。从序列中分配的值仍然“用完”,即使包含该值的行从未成功地插入到表列中。例如,如果插入事务回滚,则可能发生这种情况。有关详细信息,请参阅第9.16节中的nextval()。

也来自于nextval的文档

为了避免阻塞从同一序列中获取数字的并发事务,nextval操作永远不会回滚;也就是说,一旦获取了一个值,它就被认为是已使用的,并且不会再次返回。即使周围的事务稍后中止,或者调用查询最终不使用该值,也是如此。例如,带有ON冲突子句的INSERT将计算要插入的元组,包括执行任何所需的nextval调用,然后再检测会导致其遵循ON冲突规则的冲突。这种情况将在赋值顺序中留下未使用的“漏洞”。因此,PostgreSQL序列对象不能用于获得“无间隙”序列。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38765393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档