heroku上的Rails:push,get" PG :: UniqueViolation:ERROR:重复键值违反了唯一约束"

时间:2015-01-26 05:13:43

标签: ruby-on-rails ruby postgresql heroku

之前已多次询问此问题(herehere等等。

每当我将我的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 ...即使我的推送不包含任何迁移。

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

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

1 个答案:

答案 0 :(得分:1)

它的发生是因为主键(id)值已经存在。为什么?因为postgres中的主键序列搞砸了。如果不查看数据库或了解架构,很难建议解决方案,但是如果您的数据库可以实现10-15分钟的停机时间。你可以尝试

  1. 如果只有一个表有问题。您可以使用没有ID列的新名称将所有数据导出到新的表集中。
  2. 删除现有表并将新创建的表重命名为旧表的名称。
  3. 再次启用对我们应用的写入。
  4. 但是如果整个数据库都处于混乱状态,那么它需要更复杂的东西,但我无需查看架构即可告诉它。