每当我将我的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 ...即使我的推送不包含任何迁移。
我有点困惑为什么会发生这种情况以及可以采取哪些措施来阻止它。
不,我的部署任务中没有数据表操作代码。
答案 0 :(得分:1)
它的发生是因为主键(id
)值已经存在。为什么?因为postgres中的主键序列搞砸了。如果不查看数据库或了解架构,很难建议解决方案,但是如果您的数据库可以实现10-15分钟的停机时间。你可以尝试
但是如果整个数据库都处于混乱状态,那么它需要更复杂的东西,但我无需查看架构即可告诉它。