4

谁能帮忙解释一下?我正在使用 Populator 和 Faker gem 将一些生成的数据放入我的数据库中。除其他外,我生成了 10,000 条评论(来自“acts_as_commentable”gem。所有这些都有效。但是,当我去添加新评论时,我收到一条错误消息,指出我使用现有 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 看到的模型/表格上。

4

3 回答 3

5

如果在插入语句中显式设置了 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);
于 2010-11-13T14:59:21.523 回答
0

我不知道实际问题是什么,但肯定与使用 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

于 2010-11-13T14:24:06.097 回答
0

这是一个方便的 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;
于 2013-12-04T14:25:40.387 回答