2013-10-05 30 views
0

我执行并发复制命令,但我不指定用于串行ID字段的值。据我所知,这是确定的,如果我只有一个拷贝命令,因为Postgres将生成一个ID。没有ID值的Postgres并发副本?

但这样做事业,因为序列超过1个拷贝命令运行的冲突永远不会被复制命令更新?

回答

1

复制命令更新ID自动串行。所以,它工作正常,没有ID冲突。

我测试PostgreSQL中9.24

执行并发复制命令创建表像下面

create table tbl_test (id serial primary key, name varchar(16), age integer); 

我也由具有百万数据2 csv文件。

file1.csv

"1", 1 
"2", 2 
... 
"1000000", 1000000 

file2.csv

"n1", 1 
"n2", 2 
... 
"n1000000", 1000000 

,当我尝试从文件1同时复制,我得到的结果如下图所示

... 
1000245 | n453649 | 453649 
1000246 | 546595 | 546595 
1000247 | n453650 | 453650 
1000248 | 546596 | 546596 
1000249 | n453651 | 453651 
1000250 | 546597 | 546597 
... 

复制以及所有数据。

postgres=# select count(*) from tbl_test; 
    count 
--------- 
2000000 
(1 row) 
+0

我还需要更新副本完成后的序列号序列,是否正确? –

+0

你为什么这么想?串行和BIGSERIAL根据定义自动递增的数据加载到你的表中,因此不需要额外的处理,以确保他们递增。 – bma

+0

@bma是对的。 ID序列自动更新。您可以通过'select * from table_id_sequence_name'来查看更新后的值 – Curry

0

只要该列有一个默认序列(或者是SERIAL/BIGSERIAL数据类型),并且您没有直接在COPY命令中引用该序列,就不会在该ID上发生冲突。

序列被设计成原子,即使在交易,这也产生另一个常见的问题“我如何获得无缝序列?”