2

我有一个使用 postgreSQL 的 Rails 应用程序。

我最近对生产进行了备份并将其恢复到开发中。

当我尝试在开发中添加付款记录时,我得到:

ERROR:  duplicate key value violates unique constraint "payments_pkey"
DETAIL:  Key (id)=(1) already exists.

然而,表中只有一条 id=1 的记录,payments_id_seq 的 Current value = 1。

那么,Rails 不是在尝试添加 id=2 吗?

谢谢您的帮助!

PS - pgadmin 中是否有脚本或命令强制 id_seq 正确?

4

2 回答 2

7

如果您收到 PostgreSQL 唯一键违规错误消息(“重复键值违反唯一约束...”),可能您的主键索引不同步,例如在填充数据库之后。

利用

ActiveRecord::Base.connection.reset_pk_sequence!('[table_name]')

修复用户表的顺序。

于 2014-06-02T16:24:50.743 回答
3

大概您用来复制数据库的任何方法都不会在此过程中更新您的序列,标准转储/恢复应该可以解决这个问题,但是如果您手动逐行复制内容,那么您将不得不修复问题使用setval.

如果您只需要修复 table 的序列T,那么您可以从控制台执行此操作:

ActiveRecord::Base.connection.execute(%q{
    select setval('T_id_seq', m)
    from (
        select max(id) from T
    ) as dt(m)
})

或者您可以将该 SQL 提供给 pgadmin。你会为每张桌子重复一遍T

于 2013-09-13T23:14:09.843 回答