我正在执行并发复制命令,但没有为串行 ID 字段指定值。据我所知,如果我只有一个复制命令,这没关系,因为 Postgres 会生成一个 ID。
但是,这是否会导致与正在运行的多个复制命令发生冲突,因为复制命令永远不会更新序列?
复制命令自动更新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)
只要列具有默认序列(或者是 SERIAL/BIGSERIAL 数据类型),并且您没有直接在 COPY 命令中引用该序列,您就不会在该 id 上发生冲突。
序列被设计为原子的,即使在事务中也是如此,这也产生了另一个常见问题"如何获得无间隙序列?