Tengo una tabla con datos existentes. ¿Hay alguna manera de agregar una clave principal sin eliminar y volver a crear la tabla?
190
Tengo una tabla con datos existentes. ¿Hay alguna manera de agregar una clave principal sin eliminar y volver a crear la tabla?
( 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 unaNOT NULL
restricción (probada en postgres 9.3) como se esperaba y quería.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.
fuente
ALTER TABLE <table> DROP CONSTRAINT <pkey_name>;
Para usar una columna de identidad en v10,
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/ .
fuente
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.
fuente