Ruby on rails heroku上的导轨:推后,获取;PG::UniqueViolation:错误:重复键值违反唯一约束;

Ruby on rails heroku上的导轨:推后,获取;PG::UniqueViolation:错误:重复键值违反唯一约束;,ruby-on-rails,ruby,postgresql,heroku,Ruby On Rails,Ruby,Postgresql,Heroku,这已经被问过好几次了(还有更多) 每次我把我的rails应用程序推到Heroku(至少在最近几个月,我会说),我都必须使用熟悉的 ActiveRecord::Base.connection.tables.each { |t| ActiveRecord::Base.connection.reset_pk_sequence!(t) } 咒语。否则,当我尝试创建新记录时,postgresql会失败如下: PG::UniqueViolation: ERROR: duplicate key val

这已经被问过好几次了(还有更多)

每次我把我的rails应用程序推到Heroku(至少在最近几个月,我会说),我都必须使用熟悉的

ActiveRecord::Base.connection.tables.each { |t|    ActiveRecord::Base.connection.reset_pk_sequence!(t) }
咒语。否则,当我尝试创建新记录时,postgresql会失败如下:

PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "users_clients_pkey" DETAIL: Key (id)=(401) already exists. : INSERT INTO "users_clients" ("user_id", "client_id") VALUES (20, 46) RETURNING "id"
(这是一个示例;它发生在不同的表上,具体取决于推送后在应用程序上执行的第一个操作。)

一旦我做了重置键咒语,在我下一次按下heroku之前一切都很好。。。即使我的推送不包括任何迁移

我有点困惑,为什么会发生这种情况,以及可以采取什么措施来防止它


不,我的部署任务中没有数据表操作代码。

之所以发生这种情况,是因为主键(
id
)值已经存在。为什么?因为postgres中的主键序列是混乱的。在不查看数据库或不了解模式的情况下,很难提出解决方案,但是如果您的数据库能够支持10-15分钟的停机时间。你可以试试

  • 如果只有一张桌子有问题。您可以将所有数据导出到具有新名称的新表集中,而不使用ID列
  • 删除现有表并将新创建的表重命名为旧表的名称
  • 再次启用对我们的应用程序的写入

  • 但是,如果整个数据库都一团糟,那么它需要一些更详细的东西,但我不能不看模式就知道

    我想知道这是否与它是一个HABTM连接表这一事实有关?我已经更新了这个问题,试图让它更清楚地表明,它不仅仅发生在这个表上;这就是一个例子。我很确定这也发生在非交集表上,但下次发生时我会更仔细地观察。我唯一能想到的帮助诊断的方法是,在推送更新直到出现错误的同时,观察Heroku日志。在推送之前,在另一个窗口中执行heroku logs--tail,并观看直播。将其与本地开发环境中的日志进行比较。我正在从Mac将Rails应用程序推送到Heroku。然后,我从Windows机器上推送它,遇到了这个错误。你也在Windows电脑上推吗?这个答案很有帮助,也很容易被接受。我理解为什么。ActveRecord
    reset\u pk\u序列我上面提到的应该可以解决这个问题。我真的不明白(我想阻止的是)为什么每次推送应用程序时都会出现这种情况。你能发布一个复制这种情况的示例应用程序吗?@CuriousMind。我遇到了与OP相同的问题。每次我尝试它时,ID的索引都是1,所以有一些计数器是关闭的。但是我有130个项目,并且有通过ID链接的表,所以我不想重新创建表。我的PostgresQL(实际上是PostGIS)数据库已经存在,我在新的Rails项目中链接了它。那么,有人知道计数器在哪里以及如何重置它吗?也许我可以再尝试125次,然后到达数据库的末尾。后续:编辑:键盘大师拯救。Mac可以节省大量的推送。所以一次20支右旋箭,直到131支为止。我仍然会对柜台感到好奇。