Postgres并发副本没有ID值?

时间:2013-10-05 15:26:35

标签: sql postgresql

我正在执行并发复制命令,但未指定序列ID字段的值。据我所知,如果我只有一个复制命令就可以,因为Postgres会生成一个ID。

但这会导致与多于1个复制命令运行冲突,因为复制命令永远不会更新序列吗?

2 个答案:

答案 0 :(得分:1)

自动复制命令update id serial。所以,没有id冲突就可以正常工作。

我测试在postgresql 9.24中执行并发复制命令

我创建如下表

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

我还制作了2个包含1,000,000个数据的csv文件。

file1.csv

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

file2.csv

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

当我尝试从file1同时复制时,我得到如下所示的结果

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

答案 1 :(得分:0)

只要列具有序列作为默认值(或者是SERIAL / BIGSERIAL数据类型)并且您没有直接在COPY命令中引用它,那么您将不会在该ID上发生冲突。

序列被设计为原子的,即使在事务中也是如此,这也产生了另一个常见问题“如何获得无间隙序列?”