我执行并发复制命令,但我不指定用于串行ID字段的值。据我所知,这是确定的,如果我只有一个拷贝命令,因为Postgres将生成一个ID。没有ID值的Postgres并发副本?
但这样做事业,因为序列超过1个拷贝命令运行的冲突永远不会被复制命令更新?
我执行并发复制命令,但我不指定用于串行ID字段的值。据我所知,这是确定的,如果我只有一个拷贝命令,因为Postgres将生成一个ID。没有ID值的Postgres并发副本?
但这样做事业,因为序列超过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)
只要该列有一个默认序列(或者是SERIAL/BIGSERIAL数据类型),并且您没有直接在COPY命令中引用该序列,就不会在该ID上发生冲突。
序列被设计成原子,即使在交易,这也产生另一个常见的问题“我如何获得无缝序列?”
我还需要更新副本完成后的序列号序列,是否正确? –
你为什么这么想?串行和BIGSERIAL根据定义自动递增的数据加载到你的表中,因此不需要额外的处理,以确保他们递增。 – bma
@bma是对的。 ID序列自动更新。您可以通过'select * from table_id_sequence_name'来查看更新后的值 – Curry