我正在使用COPYPostgreSQL中的语句插入批量记录.我意识到,序列ID没有得到更新,当我尝试稍后插入记录时,它会抛出重复的序列ID.我应该手动更新序列号以获得执行后的记录数量COPY吗?执行时是不是有解决方案COPY,只需增加序列变量,即表的主键字段?请澄清一下.提前致谢!
例如,如果我插入200条记录,COPY那么表现良好,我的表格会显示所有记录.它说,当我稍后手动插入记录时duplicate sequence ID error.这很好地暗示它在COPYing期间没有增加序列ID,因为在正常INSERTing期间工作正常.而不是指示序列id设置最大记录数,是否有任何机制来教育COPY命令在其批量COPYing选项期间增加序列ID?
pil*_*row 24
你问:
我应该手动更新序列号以获得执行COPY后的记录数量吗?
是的,你应该,作为记录在这里:
COPY FROM后更新序列值:
Run Code Online (Sandbox Code Playgroud)| BEGIN; | COPY distributors FROM 'input_file'; | SELECT setval('serial', max(id)) FROM distributors; | END;
你写:
它在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一样.
我意识到这有点旧,但也许有人可能仍在寻找答案.
正如其他所说的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)
之后无需手动更新架构,它可以按预期工作,并且在我的测试中速度一样快.
然后,您可以复制到姐妹表insert into mytable select * from sister- 这将增加序列。
如果您加载的数据具有 id 字段,请不要选择它进行插入:insert into mytable (col1, col2, col3) select col1, col2, col3 from sister