2010-11-13 41 views
3

任何人都可以解释这一点吗?我正在使用Populator和Faker gems将一些生成的数据放入我的数据库中。其中,我生成了10,000条评论(这些评论来自'acts_as_commentable'gem。所有这些都有效。但是,当我添加一条新评论时,出现错误,说我使用现有ID侵犯了主键。看看我的控制台输出如下:你可以看到我有1万条记录以ID 1开始,最后以ID 100000结束。然后我尝试添加一个新的评论并且失败了,这只会发生在这个模型/表格中。新用户等重复的ID正在生成违反主键约束

>> 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. 

我怀疑这是关系到填充器的宝石是如何配料记录到数据库中。它只是发生在模型/桌,我用填充器看到的。

+0

定为所有表序列哎呀。坏头衔!对于那个很抱歉。不知道该片段如何到达那里。对问题的描述不是很明确,是吗? :) – 2010-11-13 12:55:23

+0

哦!我也可以编辑标题。固定。 – 2010-11-13 12:59:52

回答

5

如果在插入语句中明确设置了id列的值,则会发生这种情况。

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

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

你可以通过执行类似的尝试解决太低ID序列:

SELECT setval('user_id_seq', 10000); 

要了解最多: SELECT MAX(ID)FROM用户;

SELECT max(x) FROM 
    (SELECT max(id) As x FROM users 
    UNION SELECT last_value As x FROM user_id_seq As y); 
+0

许多用户使用数据库时,不能使用MAX。许多用户会看到相同的号码,都尝试使用此号码+1,并且他们的查询失败:重复密钥。使用序列或锁定表格。 – 2010-11-13 15:07:25

+0

是的,对不起,我认为他的测试不使用多线程。 SELECT ... FOR UPDATE是使线程保存的最简单方法,假设使用事务。 – 2010-11-13 15:08:29

+0

我很确定这是它。问题是,这是Populator宝石中的一个问题,所以我不得不停止使用它。但这是有用的信息! – 2010-11-13 21:48:22

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

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; 
相关问题