为什么在PostgreSQL中执行COPY时不更新序列?

siv*_*iva 13 sql postgresql

我正在使用COPYPostgreSQL中的语句插入批量记录.我意识到,序列ID没有得到更新,当我尝试稍后插入记录时,它会抛出重复的序列ID.我应该手动更新序列号以获得执行后的记录数量COPY吗?执行时是不是有解决方案COPY,只需增加序列变量,即表的主键字段?请澄清一下.提前致谢!

例如,如果我插入200条记录,COPY那么表现良好,我的表格会显示所有记录.它说,当我稍后手动插入记录时duplicate sequence ID error.这很好地暗示它在COPYing期间没有增加序列ID,因为在正常INSERTing期间工作正常.而不是指示序列id设置最大记录数,是否有任何机制来教育COPY命令在其批量COPYing选项期间增加序列ID?

pil*_*row 24

你问:

我应该手动更新序列号以获得执行COPY后的记录数量吗?

是的,你应该,作为记录在这里:

COPY FROM后更新序列值:

| BEGIN;
| COPY distributors FROM 'input_file';
| SELECT setval('serial', max(id)) FROM distributors;
| END;
Run Code Online (Sandbox Code Playgroud)

你写:

它在COPYing期间没有增加序列ID,因为在正常INSERTing期间工作正常

但事实并非如此!:)执行常规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.
Run Code Online (Sandbox Code Playgroud)

当然,您的COPY命令正在提供显式id值,就像上面的示例INSERT一样.


Pho*_*bos 6

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

正如其他所说的COPY以与INSERT类似的方式工作,因此对于插入具有序列的表,您根本就不提及序列字段,而是为您处理.对于COPY,它以同样的方式工作.但它不是COPY要求表中的所有字段都出现在文本文件中吗?正确的答案是NO,但它没有,但它是默认行为.

要复制并保留序列,请执行以下操作:

COPY $YOURSCHEMA.$YOURTABLE(col1,col2,col3,col4) FROM '$your_input_file' DELIMITER ',' CSV HEADER;
Run Code Online (Sandbox Code Playgroud)

之后无需手动更新架构,它可以按预期工作,并且在我的测试中速度一样快.

  • 除此之外,源(输入)文件只需包含您要在其中复制的列。Postgres 并不“智能”——它不会查看列标题来匹配您在复制命令中命名的列。因此,在上面的 @Phobos 示例中,输入文件必须只有 4 列。只是希望能为某人省去一些麻烦 - 这个答案对我有帮助。 (2认同)

Boh*_*ian 3

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

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