2012-02-01 82 views
10

我在PostgreSQL中使用COPY语句插入大容量记录。我意识到的是,序列ID没有得到更新,当我尝试稍后插入记录时,它会引发重复的序列ID。我应该手动更新序列号以获得执行COPY后的记录数量吗?在执行COPY时没有解决方案,只是增加序列变量,即表的主键字段?请在此澄清我。提前致谢!为什么在PostgreSQL中执行COPY时序列没有更新?

例如,如果我插入200条记录,COPY确实很好,我的表格显示所有记录。当我手动插入一条记录后,它说duplicate sequence ID error。这很好地暗示它在COPY期间不会增加序列ID,因为在正常INSERT期间工作正常。除了指示序列ID设置最大记录数外,不会有任何机制来教育COPY命令在其批量COPY选项期间递增序列ID吗?

回答

3

您可以复制到姐妹表,然后insert into mytable select * from sister - 这将增加序列。

如果您加载的数据有id字段,不要选择它插入:insert into mytable (col1, col2, col3) select col1, col2, col3 from sister

+0

感谢您的想法! – siva 2012-02-01 06:45:07

+0

将会工作的+1 – pilcrow 2012-02-02 21:05:56

20

你问:

如果我手动更新序列号获得的记录数执行COPY后?

是的,你应该为documented here

更新一个COPY FROM后的序列值:

| BEGIN; 
| COPY distributors FROM 'input_file'; 
| SELECT setval('serial', max(id)) FROM distributors; 
| END; 

你写:

它没有增加在正常复制的做工精细期间顺序ID插入

但事实并非如此! :)当你执行一个正常的INSERT时,通常你不会为SEQUENCE支持的主键指定一个明确的值。如果你没有,你会因为你现在有运行到同一个问题:

postgres=> create table uh_oh (id serial not null primary key, data char(1)); 
NOTICE: CREATE TABLE will create implicit sequence "uh_oh_id_seq" for serial column "uh_oh.id" 
NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index "uh_oh_pkey" for table "uh_oh" 
CREATE TABLE 
postgres=> insert into uh_oh (id, data) values (1, 'x'); 
INSERT 0 1 
postgres=> insert into uh_oh (data) values ('a'); 
ERROR: duplicate key value violates unique constraint "uh_oh_pkey" 
DETAIL: Key (id)=(1) already exists. 

你COPY命令,当然是提供一个明确的id值,就像例如在上方插入。

+0

当INSERT(内部使用nextval函数)期间,从其中“消耗”一个值以填充默认值时,该序列只会递增。如果您为您的ID提供值,则不会使用该序列,因此它不会移动。 – peufeu 2012-02-01 09:12:20

+0

@peufeu,是的,这是正确的 – pilcrow 2012-02-01 13:34:07

5

我意识到这有点旧,但也许有人可能仍在寻找答案。

由于其他所述COPY的工作方式与INSERT类似,所以为了插入到具有序列的表格中,您完全不必提及序列字段,并且已经为您处理。对于COPY,它的工作方式完全相同。但是不是COPY要求表中的所有字段都出现在文本文件中?正确的答案是NO,它没有,但它是默认行为。

复制和离开的顺序进行执行以下操作:

COPY $YOURSCHEMA.$YOURTABLE(col1,col2,col3,col4) FROM '$your_input_file' DELIMITER ',' CSV HEADER; 

无需事后手动更新架构,它按预期工作,并在我的测试是差不多一样快。

+1

只是为了补充一点,源(输入)文件只需要在其中复制的列。 Postgres不是“聪明的” - 它不会查看列标题以匹配您在复制命令中命名的列。所以,在上面的@Phobos例子中,输入文件只能有4列。只希望拯救一些麻烦 - 这个答案帮助了我。 – 2015-02-28 21:15:30

相关问题