0

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

但这是否会导致与运行超过 1 个复制命令的冲突,因为复制命令永远不会更新序列?

4

2 回答 2

1

复制命令自动更新 ID 序列号。所以,它工作正常,没有 id 冲突。

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

我创建如下表

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

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

文件 1.csv

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

文件2.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)
于 2013-10-05T16:00:59.927 回答
0

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

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

于 2013-10-05T15:28:44.813 回答