2013-12-08 71 views
0

問題我有一個表像這樣定義:Postgres的:用插入與選擇

CREATE TABLE wp_master (
    gid integer NOT NULL DEFAULT nextval('wp_master_gid_seq'::regclass), 
    name character varying(80), 
    .... 
    type integer DEFAULT 4, 
    CONSTRAINT p_key PRIMARY KEY (gid), 
); 

我希望將數據從另一個表,所以我

insert into wp_master (name, .... type) select "NAME", ...., 1 from ."Tiri2011"; 

插入表中,但我得到的錯誤:

ERROR: duplicate key value violates unique constraint "p_key" 
DETAIL: Key (gid)=(2) already exists. 

爲什麼postgres試圖把任何東西放到gid字段中,當我明確沒有將它包含在col列表中時UMNS?我認爲gid從序列中獲得了它的價值。

羅素

回答

1

是試圖插入wp_master_gid_seq序列的下一個值。聲明一個id列爲serial(自動增量)將創建一個序列,該序列具有自動遞增的最後插入的id的存儲值。如果在任何時候您手動插入gid值,則會繞過序列,並且自動增量功能可能會中斷,因爲序列值沒有相應更新。

解決它的最簡單方法是序列的值更改爲(你的表的最大GID值)+ 1,就執行一次這一點,你應該確定

select setval('wp_master_gid_seq', coalesce((select max(id)+1 from wp_master), 1), false) 
+0

我原本以爲做到了這一點: CREATE SEQUENCE base.wp_master_gid_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 114 CACHE 1; –

+0

我也嘗試setval,但問題仍然存在。 'select max(gid)from base.wp_master;' 返回113 –

+0

我弄明白了。問題在於序列在另一個模式中,所以無論我在與表格相同的模式中做了什麼,它都沒有作用。我已經接受Foibs的回答,因爲儘管它沒有真正回答這個問題,但它給了我用來解決問題的重要信息。 –