referencia reemplazar por columna ambigua sql postgresql alter-table

reemplazar - ¿Cómo puedo agregar una columna a una base de datos Postgresql que no permita valores nulos?



la referencia a la columna es ambigua postgresql (8)

Estoy agregando una nueva columna "NO NULA" a mi base de datos Postgresql usando la siguiente consulta (saneada para Internet):

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL;

Cada vez que ejecuto esta consulta, recibo el siguiente mensaje de error:

ERROR: column "mycolumn" contains null values

Estoy perplejo. ¿A dónde me voy mal?

NOTA: Estoy utilizando pgAdmin III (1.8.4) principalmente, pero recibí el mismo error cuando ejecuté el SQL desde dentro de Terminal.


Como han observado otros, debe crear una columna que pueda contener nulos o proporcionar un valor DEFAULT. Si eso no es lo suficientemente flexible (por ejemplo, si necesita que el nuevo valor se calcule de forma individual para cada fila), puede usar el hecho de que en PostgreSQL, todos los comandos DDL se pueden ejecutar dentro de una transacción:

BEGIN; ALTER TABLE mytable ADD COLUMN mycolumn character varying(50); UPDATE mytable SET mycolumn = timeofday(); -- Just a silly example ALTER TABLE mytable ALTER COLUMN mycolumn SET NOT NULL; COMMIT;


Como las filas ya existen en la tabla, la instrucción ALTER intenta insertar NULL en la columna recién creada para todas las filas existentes. Tendría que agregar la columna para permitir NULL , luego llenar la columna con los valores que desea y luego establecerla en NOT NULL después.


Debe definir un valor predeterminado o hacer lo que dice Sean y agregarlo sin la restricción nula hasta que lo haya completado en las filas existentes.


Esta consulta actualizará automáticamente los nulos.

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) DEFAULT ''whatever'' NOT NULL;


Esto funcionó para mí: :)

ALTER TABLE your_table_name ADD COLUMN new_column_name int;


La especificación de un valor predeterminado también funcionaría, asumiendo que un valor predeterminado es apropiado.


O bien, cree una nueva tabla como temp con la columna adicional, copie los datos a esta nueva tabla mientras la manipula según sea necesario para completar la nueva columna que no acepta nulos, y luego intercambie la tabla mediante un cambio de nombre de dos pasos.

Sí, es más complicado, pero es posible que tenga que hacerlo de esta manera si no desea una gran ACTUALIZACIÓN en una mesa en vivo.


Tienes que establecer un valor por defecto.

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL DEFAULT ''foo''; ... some work (set real values as you want)... ALTER TABLE mytable ALTER COLUMN mycolumn DROP DEFAULT;