2013-10-05 33 views
0

我執行併發複製命令,但我不指定用於串行ID字段的值。據我所知,這是確定的,如果我只有一個拷貝命令,因爲Postgres將生成一個ID。沒有ID值的Postgres併發副本?

但這樣做事業,因爲序列超過1個拷貝命令運行的衝突永遠不會被複制命令更新?

回答

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) 
+0

我還需要更新副本完成後的序列號序列,是否正確? –

+0

你爲什麼這麼想?串行和BIGSERIAL根據定義自動遞增的數據加載到你的表中,因此不需要額外的處理,以確保他們遞增。 – bma

+0

@bma是對的。 ID序列自動更新。您可以通過'select * from table_id_sequence_name'來查看更新後的值 – Curry

0

只要該列有一個默認序列(或者是SERIAL/BIGSERIAL數據類型),並且您沒有直接在COPY命令中引用該序列,就不會在該ID上發生衝突。

序列被設計成原子,即使在交易,這也產生另一個常見的問題「我如何獲得無縫序列?」