Respuestas:
( Actualizado - Gracias a las personas que comentaron )
Supongamos que tiene una tabla llamada test1
, a la que desea agregar una id
columna de clave primaria (sustituto) de incremento automático . El siguiente comando debería ser suficiente en versiones recientes de PostgreSQL:
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
En las versiones anteriores de PostgreSQL (anteriores a 8.x?) Tenía que hacer todo el trabajo sucio. La siguiente secuencia de comandos debería 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');
Nuevamente, en versiones recientes de Postgres esto es más o menos equivalente al comando anterior.
ADD PRIMARY KEY
también crea una NOT NULL
restricción (probada en postgres 9.3) como se esperaba y quería.
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
Esto es todo lo que necesitas para:
id
columnaSe le da crédito a @resnyanskiy que dio esta respuesta en un comentario.
ALTER TABLE <table> DROP CONSTRAINT <pkey_name>;
Para usar una columna de identidad en v10,
ALTER TABLE test
ADD COLUMN id { int | bigint | smallint}
GENERATED { BY DEFAULT | ALWAYS } AS IDENTITY PRIMARY KEY;
Para obtener una explicación de las columnas de identidad, consulte https://blog.2ndquadrant.com/postgresql-10-identity-columns/ .
Para conocer la diferencia entre GENERADO POR DEFECTO y SIEMPRE GENERADO, consulte https://www.cybertec-postgresql.com/en/sequences-gains-and-pitfalls/ .
Para alterar la secuencia, consulte https://popsql.io/learn-sql/postgresql/how-to-alter-sequence-in-postgresql/ .
SQL Error [23502]: ERROR: column "id" contains null values
Aterricé aquí porque también estaba buscando algo así. En mi caso, estaba copiando los datos de un conjunto de tablas de preparación con muchas columnas en una tabla mientras 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 instrucción Insert. Luego, una simple selección * en la tabla de destino rellenó automáticamente esta columna. Aquí están 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;