我執行併發複製命令,但我不指定用於串行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