生成的重复ID违反主键约束

NJ.*_*NJ. 4 postgresql ruby-on-rails acts-as-commentable

有人可以帮忙解释一下吗?我使用Populator和Faker宝石将一些生成的数据放入我的数据库.除此之外,我生成了10,000条评论(来自'acts_as_commentable'宝石.这一切都有效.但是,当我去添加新评论时,我收到一条错误消息,说我使用现有的id侵犯了主键看看我下面的控制台输出.你可以看到我有10,000条记录,从ID 1开始,以ID 100000结尾.然后我尝试添加一条新的评论,但它失败.这只发生在这个模型/表中.我可以添加新用户等

>> Comment.first(:order => 'id').id
=> 1
>> Comment.last(:order => 'id').id
=> 10000
>> Comment.count
=> 10000
>> Comment.create(:title => 'wtf is up?')
ActiveRecord::RecordNotUnique: PGError: ERROR:  duplicate key value violates unique constraint "comments_pkey"
DETAIL:  Key (id)=(1) already exists.
Run Code Online (Sandbox Code Playgroud)

我怀疑这与Populator gem如何将记录批量编入数据库有关.它只发生在我用Populator看到的模型/表格上.

Hen*_*ann 5

如果在insert语句中显式设置了id列的值,则会发生这种情况.

对于每个id-column,Postgres中都有一个序列,通常命名为tablename_columnname_seq,例如user_id_seq.

请检查pgadmin3中表定义中的名称,因为rails不支持具有其他名称的序列.

您可以通过执行类似于以下的操作来修复ID过低的序列:

SELECT setval('user_id_seq', 10000);
Run Code Online (Sandbox Code Playgroud)

要学习最高数字:SELECT max(id)FROM users;

SELECT max(x) FROM 
   (SELECT max(id) As x FROM users
    UNION SELECT last_value As x FROM user_id_seq As y);
Run Code Online (Sandbox Code Playgroud)