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

有人可以帮忙解释一下吗?我使用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.
我怀疑这与Populator gem如何将记录批量编入数据库有关。它只发生在我用Populator看到的模型/表格上。     
已邀请:
如果在insert语句中显式设置了id列的值,则会发生这种情况。 对于每个id-column,Postgres中都有一个序列,通常命名为tablename_columnname_seq,例如user_id_seq。 请检查pgadmin3中表定义中的名称,因为rails不支持具有其他名称的序列。 您可以通过执行类似于以下的操作来修复ID过低的序列:
SELECT setval('user_id_seq', 10000);
要了解最高数字:     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);
    
我不知道实际问题是什么,但它肯定与使用Populator gem添加记录有关。使用以下方式生成数据:
Populator.sentences(1..3) # makes 3 sentences
很好。 但是,生成记录就像
User.populate 5000 do |user| # makes 5000 users in batches of 1000
   user.name = Populator.words(1)
   ...
end
那里的东西引起了我的问题。请注意我使用的是Rails 3.0.1     
这是一个方便的PostreSQL脚本,可以同时修复所有表的序列
SELECT  'SELECT SETVAL(' ||quote_literal(quote_ident(S.relname))|| ', MAX(' ||quote_ident(C.attname)|| ') ) FROM ' ||quote_ident(T.relname)|| ';'
FROM pg_class AS S, pg_depend AS D, pg_class AS T, pg_attribute AS C
WHERE S.relkind = 'S'
AND S.oid = D.objid
AND D.refobjid = T.oid
AND D.refobjid = C.attrelid
AND D.refobjsubid = C.attnum
ORDER BY S.relname;
    

要回复问题请先登录注册