2009-02-04 23 views
180

estoy añadiendo una nueva columna, "NOT NULL" a mi base de datos PostgreSQL usando la siguiente consulta (desinfectado para Internet):¿Cómo puedo agregar una columna a una base de datos Postgresql que no permita valores nulos?

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

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

ERROR: column "mycolumn" contains null values 

estoy perplejo. ¿Dónde estoy equivocado?

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

Respuesta

305

Tiene que establecer un valor predeterminado.

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; 
+1

Buena solución. No pude acceder a los documentos de postgres en línea por algún motivo para ver cuál sería la sintaxis para esto. –

+3

@SeanBright, puede acceder al doc de postgres sin conexión haciendo 'man ALTER_TABLE' :) –

+0

@ allan.simon Nunca antes había usado PostgreSQL y no lo tengo instalado en ninguna parte. –

47

Dado que las filas ya existen en la tabla, la instrucción ALTER está tratando de insertar en la columna recién creada para todas las filas existentes. Debería agregar la columna como NULL, luego llenar la columna con los valores que desea y luego configurarla en NOT NULL después.

+6

Ejemplo de cómo hacerlo, habría sido muy agradable. De lo contrario, la solución de Luc parece ser más completa y está lista para usar. –

+1

Consulte esta respuesta para ver un ejemplo: http://stackoverflow.com/a/516016/32453 – rogerdpack

5

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.

1

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

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

+3

No lo hice -1, pero creo que puede haber dificultades sutiles con esto, p. Ej. Apuesto a que los índices, desencadenantes y vistas existentes seguirán refiriéndose a la tabla original incluso después del cambio de nombre, ya que creo que almacenan el contenido de la tabla (que no cambia) en lugar de su nombre. –

+1

Sí, debería haber indicado que la nueva tabla debe ser una copia exacta del original, incluyendo la adición de índices y demás. Mi mal por ser demasiado breve. La razón de esto es que también hay difi- cultades sutiles para realizar un ALTER sobre una tabla que puede estar en vivo, y en ocasiones es necesario escenificarlo. – alphadogg

+0

Por ejemplo, utilizando el enfoque PREDETERMINADO, agregará ese valor predeterminado a cada fila. No estoy seguro de cómo Postgres bloquea una tabla al hacer esto. O bien, si el orden de las columnas es importante, no puede agregar una columna con el comando ALTER. – alphadogg

2

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

+1

Mejorará la respuesta para dar la sintaxis modificada para crear la columna con un valor predeterminado (por ejemplo). – hardmath

52

Como han observado otros, debe crear una columna que pueda agregarse nulos o proporcionar un valor DEFAULT. Si eso no es lo suficientemente flexible (por ejemplo, si necesita el nuevo valor que se calcula para cada fila individual de alguna manera), puede utilizar el hecho de que en PostgreSQL, todos los comandos DDL pueden ejecutarse 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; 
+1

incluso en una transacción, NOT NULL se impone de inmediato, por lo tanto, primero debe agregar valores de columna y de relleno, luego agregue NOT NULL, como lo hace esta respuesta. (probado en postgres 9.6) –

0

esta consulta se auto-actualizar los nulos

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

esto funcionó para mí: :)

ALTER TABLE your_table_name ADD COLUMN new_column_name int; 
+1

No hay una restricción 'NOT NULL' en su consulta. Por supuesto que está funcionando. – Sylvain

Cuestiones relacionadas