Sql 没有ID值的Postgres并发副本?

Sql 没有ID值的Postgres并发副本?,sql,postgresql,Sql,Postgresql,我正在执行并发复制命令,但没有为串行ID字段指定值。据我所知,如果我只有一个copy命令,这是可以的,因为Postgres将生成一个ID 但是,由于复制命令从未更新序列,因此这会导致与运行的多个复制命令发生冲突吗?只要列有一个默认序列(或者是串行/BIGSERIAL数据类型),并且您没有在复制命令中直接引用该序列,您就不会在该id上发生冲突 序列被设计为原子的,即使在事务中也是如此,这也会产生另一个常见问题“如何获得无间隙序列?”复制命令自动更新id序列。因此,它工作正常,没有id冲突 我测试在

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


但是,由于复制命令从未更新序列,因此这会导致与运行的多个复制命令发生冲突吗?

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


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

复制命令自动更新id序列。因此,它工作正常,没有id冲突

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

我创建如下表

create table tbl_test (id serial primary key, name varchar(16), age integer);
...
1000245 | n453649 | 453649
1000246 | 546595  | 546595
1000247 | n453650 | 453650
1000248 | 546596  | 546596
1000249 | n453651 | 453651
1000250 | 546597  | 546597
...
我还制作了2个csv文件,其中包含1000000个数据

file1.csv

"1", 1
"2", 2
...
"1000000", 1000000
文件2.csv

"n1", 1
"n2", 2
...
"n1000000", 1000000
当我尝试从file1同时复制时,得到如下结果

create table tbl_test (id serial primary key, name varchar(16), age integer);
...
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根据定义在数据加载到表中时自动递增,因此不需要额外的处理来确保它们递增。@bma是正确的。id序列会自动更新。您可以通过“从表\u id\u序列\u名称中选择*来查看更新后的值”