2012-02-28 6 views
56

Ho una piccola tabella (~ 30 righe) nel mio database Postgres 9.0 con un campo ID intero (la chiave primaria) che attualmente contiene interi sequenziali univoci a partire da 1, ma che era non creato utilizzando la parola chiave 'seriale'.Aggiunta di 'serial' alla colonna esistente in Postgres

Come posso modificare questa tabella in modo tale che da ora in poi gli inserimenti in questa tabella causeranno questo campo come se fosse stato creato con "seriale" come tipo?

risposta

86

Osservare i seguenti comandi (specialmente il blocco commentato).

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

Dal momento che stai citano chiavi primarie nella vostra OP, potresti anche voler 'ALTER TABLE foo ADD PRIMARY KEY (a)'. –

23

È inoltre possibile utilizzare START WITH per avviare una sequenza da un particolare punto, anche se setval compie la stessa cosa, come nella risposta di Eulero, ad esempio,

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'); 
Problemi correlati