Ruby on rails PostgreSQL总是创建具有偶数ID的记录?

Ruby on rails PostgreSQL总是创建具有偶数ID的记录?,ruby-on-rails,ruby-on-rails-3,postgresql,Ruby On Rails,Ruby On Rails 3,Postgresql,出于某种原因,我的PostgreSQL 9.2数据库会跳过每个记录的ID。例如: 使用者 这是什么原因造成的?任何指向解决此问题的正确方向的指针都是值得赞赏的。谢谢这些评论充分说明了可能的原因: 多个nextval调用,比如一个default调用和一个explicit调用 多个表使用的相同序列 正在回滚的事务 任何指向解决此问题的正确方向的指针都将受到赞赏 您的主要错误是将此视为一个问题。在生成的序列中出现间隙是完全正常的。如果数据库崩溃并重新启动,将按顺序出现一个间隙。如果事务在分配ID后

出于某种原因,我的PostgreSQL 9.2数据库会跳过每个记录的ID。例如:

使用者


这是什么原因造成的?任何指向解决此问题的正确方向的指针都是值得赞赏的。谢谢

这些评论充分说明了可能的原因:

  • 多个
    nextval
    调用,比如一个
    default
    调用和一个explicit调用
  • 多个表使用的相同序列
  • 正在回滚的事务
任何指向解决此问题的正确方向的指针都将受到赞赏

您的主要错误是将此视为一个问题。在生成的序列中出现间隙是完全正常的。如果数据库崩溃并重新启动,将按顺序出现一个间隙。如果事务在分配ID后回滚,则序列中将出现间隙

您的应用程序必须能够处理此问题。它不应该关心ID是什么,只是它是唯一的


有关详细信息以及如果您需要真正无间隙序列的提示,请参阅。

注释充分涵盖了可能的原因:

  • 多个
    nextval
    调用,比如一个
    default
    调用和一个explicit调用
  • 多个表使用的相同序列
  • 正在回滚的事务
任何指向解决此问题的正确方向的指针都将受到赞赏

您的主要错误是将此视为一个问题。在生成的序列中出现间隙是完全正常的。如果数据库崩溃并重新启动,将按顺序出现一个间隙。如果事务在分配ID后回滚,则序列中将出现间隙

您的应用程序必须能够处理此问题。它不应该关心ID是什么,只是它是唯一的


有关详细信息和提示,如果您需要真正的无间隙序列,请参见。

添加到Craig的观点中,我认为您会发现一个关键的罪魁祸首是
规则
将新的.id插入另一个表中。这将导致双增量,因为
规则
重写查询,因此new.id最终将成为“我们上次计算new.id所做的一切”(这意味着再次递增序列)


如果它是一致的,IMO最有可能的原因是有人在没有完全理解gotchas的情况下创建了DO-Always规则。

除了Craig的观点之外,我想你会发现一个关键的罪魁祸首是一个
DO-Always
规则
将新的.id插入另一个表中。这将导致双增量,因为
规则
重写查询,因此new.id最终将成为“我们上次计算new.id所做的一切”(这意味着再次递增序列)


如果是一致的,IMO最有可能的原因是有人在没有完全理解问题的情况下创建了DO ALLOS规则。

我打赌您是在某处(一致地)回滚一个insert,或者您为每个insert调用了两次
nextval(),该列可以设置为自动递增2。您能为正在使用的序列提供
CREATE SEQUENCE…
吗?另一种(远程)可能性-相同的序列用于两个同时需要插入的表。我只是好奇-为什么这是一个问题?您不可能用完偶数。我打赌您是在某处(一致地)回滚一个insert,或者您为每个insert调用了两次
nextval()
。查看数据库表设置,该列可能设置为自动递增2。您是否可以为正在使用的序列提供
CREATE SEQUENCE…
(远程)可能性-相同的序列用于两个同时需要插入的表。我只是好奇-为什么这是一个问题?您不可能用完偶数。
1258930
1258932
1258934
1258936