2014-04-01 39 views

回答

3

A serial列僅從默認的序列中提取下一個數字。如果您爲其寫入值,則默認值將不會生效。您可以將COPY添加到表(see @Saravanan' answer),然後相應地更新序列。 一個方式做到這一點:

SELECT setval('tbl_tbl_id_seq', max(tbl_id)) FROM tbl; 

tbl_id是表tbl的連載專欄,從序列tbl_tbl_id_seq(默認名稱)繪製。

最好在單筆交易在併發負載的情況下。

請注意,這裏沒有錯誤1的錯誤。 Per documentation:

兩個參數的形式設置序列的last_value字段爲 指定的值,並將其is_called字段設置爲true,這意味着 下一個nextval會返回一個值之前提前序列

大膽重視我的。

2

您可以直接將CSV記錄複製到POSTGRES表中。

COPY table_name FROM '/path/to/csv' DELIMITER ',' CSV; 

通過以上方法,我們實際上可以避免通過ActiveRecord對象創建記錄。

+0

提供'id'列的值的順序如何? –

+0

@mu必須重置爲相應的值不是? – Saravanan

+1

我很肯定COPY不會爲你做這樣的事情,這樣COPY會給你留下一個破壞的表格(即未來的INSERT可能會因爲重複的PK而失敗),除非你做['setval'](http:///www.postgresql.org/docs/current/static/functions-sequence.html)來修復序列。 –