2012-02-28 11 views
56

Tengo una pequeña tabla (~ 30 filas) en mi base de datos Postgres 9.0 con un campo de ID entero (la clave primaria) que contiene actualmente enteros secuenciales únicos comenzando en 1, pero que era no creado usando la palabra clave 'serial'.Agregando 'serial' a la columna existente en Postgres

¿Cómo puedo modificar esta tabla de forma que a partir de ahora las inserciones en esta tabla hagan que este campo se comporte como si hubiera sido creado con 'serie' como tipo?

Respuesta

86

Observe los siguientes comandos (especialmente el bloque comentado).

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

Puesto que usted está mencionando las claves principales en su OP, también puede querer 'ALTER TABLE foo ADD PRIMARY KEY (a) '. –

23

También puede utilizar START WITH para iniciar una secuencia de un punto en particular, aunque logra setval lo mismo, al igual que en la respuesta de Euler, por ejemplo,

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'); 
Cuestiones relacionadas