我在Django中有一个Booking
模型,它的ID是Django创建的内置id
列。下面是在Postgres中如何看待数据库级别:
integer not null default nextval('bookings_booking_id_seq'::regclass)
客户今天打电话来,担心这些数字似乎是连续的,但并不总是连续的。例如,顺序如下:
..2, ..3, ..4, ..6, ..8, ..9
他们担心系统正在取消或删除预订。..5
和..7
在哪里?我们记录了几乎所有可以删除预订的内容,所以我很有信心这不是一个系统问题。程序员的直觉也教会了我不要期望自动ID的连续性,但是仅仅凭直觉是不够的,不足以向客户解释。
在分配这些it时,Postgres是否有跳过数字的技术原因?
发布于 2016-08-04 10:59:46
由于小串行、串行和大串行是使用序列实现的,因此可能在列中出现的值序列中存在“漏洞”或空白,即使没有删除任何行。从序列中分配的值仍然“用完”,即使包含该值的行从未成功地插入到表列中。例如,如果插入事务回滚,则可能发生这种情况。有关详细信息,请参阅第9.16节中的nextval()。
也来自于nextval
的文档
为了避免阻塞从同一序列中获取数字的并发事务,nextval操作永远不会回滚;也就是说,一旦获取了一个值,它就被认为是已使用的,并且不会再次返回。即使周围的事务稍后中止,或者调用查询最终不使用该值,也是如此。例如,带有ON冲突子句的INSERT将计算要插入的元组,包括执行任何所需的nextval调用,然后再检测会导致其遵循ON冲突规则的冲突。这种情况将在赋值顺序中留下未使用的“漏洞”。因此,PostgreSQL序列对象不能用于获得“无间隙”序列。
https://stackoverflow.com/questions/38765393
复制相似问题