2012-02-28 101 views
56

我的Postgres 9.0數據庫中有一個小表(〜30行),它有一個整數ID字段(主鍵),它當前包含從1開始的唯一順序整數,但是不是使用'serial'關鍵字創建的。在'Postgres'的現有列中添加'serial'

我該如何修改這個表,以便從現在開始插入到這個表中將導致這個字段的行爲就好像它是用'serial'作爲類型創建的?

回答

86

看看下面的命令(特別是註釋塊)。

DROP TABLE foo; 
DROP TABLE bar; 

CREATE TABLE foo (a int, b text); 
CREATE TABLE bar (a serial, b text); 

INSERT INTO foo (a, b) SELECT i, 'foo ' || i::text FROM generate_series(1, 5) i; 
INSERT INTO bar (b) SELECT 'bar ' || i::text FROM generate_series(1, 5) i; 

-- blocks of commands to turn foo into bar 
CREATE SEQUENCE foo_a_seq; 
ALTER TABLE foo ALTER COLUMN a SET DEFAULT nextval('foo_a_seq'); 
ALTER TABLE foo ALTER COLUMN a SET NOT NULL; 
ALTER SEQUENCE foo_a_seq OWNED BY foo.a; -- 8.2 or later 

SELECT MAX(a) FROM foo; 
SELECT setval('foo_a_seq', 5); -- replace 5 by SELECT MAX result 

INSERT INTO foo (b) VALUES('teste'); 
INSERT INTO bar (b) VALUES('teste'); 

SELECT * FROM foo; 
SELECT * FROM bar; 
+0

既然你提的主鍵你OP,你可能還想'ALTER TABLE foo ADD PRIMARY KEY(a)'。 – 2014-09-15 17:14:53

23

您還可以使用START WITH開始從一個特定點的序列,雖然SETVAL完成同樣的事情,在歐拉的答案,例如,

SELECT MAX(a) + 1 FROM foo; 
CREATE SEQUENCE foo_a_seq START WITH 12345; -- replace 12345 with max above 
ALTER TABLE foo ALTER COLUMN a SET DEFAULT nextval('foo_a_seq');