2010-05-31 27 views

Respuesta

195

(Actualizado - Gracias a las personas que comentaron)

versiones modernas de PostgreSQL

Suponga que tiene una tabla llamada test1, a la que desea agregar un incremento automático, clave primaria id (sustituta) columna. El siguiente comando debería ser suficiente en las últimas versiones de PostgreSQL:

ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY; 

versiones anteriores de PostgreSQL

En las versiones anteriores de PostgreSQL (antes de 8.x?) Que tenía que hacer todo el trabajo sucio. La siguiente secuencia de comandos debe hacer el truco:

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

Una vez más, en las últimas versiones de Postgres esto es más o menos equivalente al comando individual arriba.

+24

UPDATE test1 SET id = DEFAULT; también funciona –

+3

Estoy usando ORACLE, por lo que compartirlo podría ser útil para los chicos de ORACLE En ORACLE: ALTER TABLE TEST1 ADD ID NUMBER; UPDATE TEST1 SET ID = TEST1_SEQ.NEXTVAL; ALTER TABLE TEST1 ADD PRIMARY KEY (ID); cree una Secuencia TEST1_SEQ antes de ejecutar la instrucción UPDATE – msbyuva

+0

Tenga en cuenta que 'ADD PRIMARY KEY' también crea una restricción' NOT NULL' (probada en postgres 9.3) como se esperaba y se desea. –

37
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY; 

Esto es todo lo que necesita:

  1. Añadir la columna id
  2. rellenarlo con una secuencia de 1 a count (*).
  3. Configúrelo como clave principal/no nulo.

Se le ha dado crédito a @resnyanskiy quien dio esta respuesta en un comentario.

+2

Esto debe marcarse como respuesta, y la respuesta debe pertenecer a @resnyanskiy –

0

Aterricé aquí porque estaba buscando algo así también. En mi caso, estaba copiando los datos de un conjunto de tablas de etapas con muchas columnas en una tabla, al mismo tiempo que asignaba identificadores de fila a la tabla de destino. Aquí hay una variante de los enfoques anteriores que utilicé. Agregué la columna de serie al final de mi tabla de destino. De esa manera no tengo que tener un marcador de posición en la declaración Insertar. Luego, una simple selección * en la tabla de destino llenó automáticamente esta columna. Estas son las dos declaraciones SQL que utilicé en PostgreSQL 9.6.4.

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

Para utilizar una columna de identidad en v10,

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

Para una explicación de las columnas de identidad, consulte https://blog.2ndquadrant.com/postgresql-10-identity-columns/.

Para la diferencia entre GENERADO POR PREDETERMINADO y SIEMPRE GENERADO, vea https://www.cybertec-postgresql.com/en/sequences-gains-and-pitfalls/.

Para modificar la secuencia, consulte https://popsql.io/learn-sql/postgresql/how-to-alter-sequence-in-postgresql/.

+0

El problema con esta solución es que si la tabla ya contiene filas, se obtiene un error: 'Error SQL [23502]: ERROR: columna" id "contiene valores nulos' – isapir

Cuestiones relacionadas