2012-02-28 18 views
56

Postgres 9.0 veritabanımda, 1'den başlayarak benzersiz sıralı tamsayılar içeren bir tamsayı KIMLIĞI alanına (birincil anahtar) sahip küçük bir çizelgem var (~ 30 satır) 'seri' anahtar kelimesi kullanılarak oluşturulmadı.PostGres'te varolan sütuna 'seri' ekleme

Bu tabloyu nasıl değiştirebilirim, şu andan itibaren bu tablodaki ekler, bu alanın 'seri' türüyle oluşturulmuş gibi davranmasına neden olacak mı?

cevap

86

Aşağıdaki komutlara bakın (özellikle yorumlanan blok).

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

, belirli bir noktadan bir diziyi başlatmak için kullanabileceğiniz senin OP, ayrıca “ALTER TABLE foo ADD PRIMARY KEY (a)' yapmak isteyebilirsiniz. –

23

Ayrıca setval örn Euler cevap olduğu gibi, aynı işlevi görecektir olsa da birincil anahtarlar söz ediyoruz yana START WITH

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'); 
İlgili konular