2014-09-22 37 views
2

我有一個表linelevelpmts,列seq(Int4)將用作序列。您可以在Postgres中已經存在的列上創建序列

我知道我可以刪除列並將其重新創建爲類型序列,但是我可以修改現有列作爲序列使用。

ALTER TABLE "public"."linelevelpmts" ALTER COLUMN "seq" SET DEFAULT nextval('linelevelpmts_seq_seq'::regclass); 

此代碼生成錯誤:關係linelevelpmts_seq_seq不存在。

+1

「*有一列被用作序列*」並沒有真正合理。你不會像序列那樣使用*列。您從序列中提供它們的默認值。 – 2014-09-22 11:14:21

+0

該表是在數據導入過程中以編程方式創建的。我知道我可以刪除表格並重新創建它,我只是想知道是否有另一種方式。 – kipsoft 2014-09-22 12:05:09

+0

@kipsoft序列不是一列。它是數據庫中的一個獨立對象,用於生成序列號(無論用途如何)。序列可以用作列的默認值(稱爲「SERIAL」數據類型)。 – 2014-09-22 12:08:11

回答

11

This code generates an error: Relation linelevelpmts_seq_seq does not exist.

那麼你需要首先創建要使用默認值順序:

create sequence linelevelpmts_seq_seq; 
ALTER TABLE public.linelevelpmts 
    ALTER COLUMN seq SET DEFAULT nextval('linelevelpmts_seq_seq'::regclass); 

如果你想同樣的效果,如果它是作爲serial創建你也需要改變序列的 「主人」:

alter sequence linelevelpmts_seq_seq owned by linelevelpmts.seq; 

編輯

伊戈爾的評論是一個很好的一個:如果你已經在列seq值,您應該調整序列的初始值:

select setval('linelevelpmts_seq_seq', (select max(seq) from linelevelpmts)); 
+0

謝謝!那正是我所期待的。 – kipsoft 2014-09-22 12:08:04

+2

@kipsoft您可能還需要將創建的序列設置爲'linelevelpmts'的max(seq)。否則'nextval('linelevelpmts_seq_seq')'將產生從1開始的值(與'linelevelpmts'中的值已經重複)。 – 2014-09-22 12:09:59

+0

@IgorRomanchenko:謝謝,非常好的一點。我添加了一個關於如何調整序列當前值的例子。 – 2014-09-22 12:22:47

相關問題