2010-05-31 89 views

回答

195

更新 - 感謝誰評論人)

的PostgreSQL

的現代版本

假設你有一個名爲test1到要添加一個自動遞增的表,主鍵id(代理)欄。下面的命令應該在最新版本的PostgreSQL的足夠:在PostgreSQL

ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY; 

舊版本(到8.x前?),你必須做所有的髒活舊版本的PostgreSQL。下面的命令序列應該可以做到這一點:

ALTER TABLE test1 ADD COLUMN id INTEGER; 
    CREATE SEQUENCE test_id_seq OWNED BY test1.id; 
    ALTER TABLE test ALTER COLUMN id SET DEFAULT nextval('test_id_seq'); 
    UPDATE test1 SET id = nextval('test_id_seq'); 

同樣,在Postgres的最新版本中,這大致等同於上面的單個命令。

+24

UPDATE test1 SET id = DEFAULT;也適用。 – 2010-05-31 15:57:39

+3

我使用的是ORACLE,所以分享它可能對ORACLE傢伙有用在ORACLE中:ALTER TABLE TEST1 ADD ID NUMBER; UPDATE TEST1 SET ID = TEST1_SEQ.NEXTVAL; ALTER TABLE TEST1添加主鍵(ID);在執行UPDATE語句之前創建一個序列TEST1_SEQ – msbyuva 2011-06-22 20:19:02

+0

請注意,'ADD PRIMARY KEY'也會按照預期和想要創建'NOT NULL'約束(在postgres 9.3中進行測試)。 – 2014-02-07 20:36:53

37
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY; 

這是所有你需要:

  1. 添加id
  2. 用序列填充它從1到COUNT(*)。
  3. 將其設置爲主鍵/不爲空。

感謝評論中給出了這個答案的@resnyanskiy。

+2

這應該被標記爲答案,答案應該屬於@resnyanskiy – 2016-05-16 09:50:50

0

我在這裏降落是因爲我也在尋找類似的東西。在我的情況下,我將一組具有許多列的登臺表中的數據複製到一個表中,同時將行ID分配給目標表。這是我使用的上述方法的一個變體。 我在目標表的末尾添加了串行列。這樣我就不必在Insert語句中有一個佔位符了。然後一個簡單的選擇*到目標表中自動填充此列。以下是我在PostgreSQL 9.6.4上使用的兩條SQL語句。

ALTER TABLE target ADD COLUMN some_column SERIAL; 
INSERT INTO target SELECT * from source; 
0

要在V10使用標識列,

ALTER TABLE test 
ADD COLUMN id { int | bigint | smallint} 
GENERATED { BY DEFAULT | ALWAYS } AS IDENTITY PRIMARY KEY; 

身份列的說明,請參閱https://blog.2ndquadrant.com/postgresql-10-identity-columns/

有關GENERATED BY DEFAULT和GENERATED ALWAYS之間的差異,請參見https://www.cybertec-postgresql.com/en/sequences-gains-and-pitfalls/

要更改序列,請參閱https://popsql.io/learn-sql/postgresql/how-to-alter-sequence-in-postgresql/

+0

這個解決方案的問題是如果表已經包含行,那麼你會得到一個錯誤:SQL錯誤[23502]:錯誤:列「id」包含空值「 – isapir 2018-03-07 16:30:07

相關問題