sql >> Base de Datos >  >> RDS >> PostgreSQL

Se produce un error al agregar una columna que no admite valores NULL a la tabla existente. ¿Se está ignorando el atributo de valor?

Respuesta corta

El atributo "valor" no funcionará si agrega una restricción no nula en el momento de la creación de la columna (esto no se menciona en documentación ). El SQL generado no podrá ejecutarse.

Solución alternativa

La solución alternativa descrita en la pregunta es el camino a seguir. El SQL resultante será:

  1. Agregar la columna

    ALTER TABLE layer ADD COLUMN abstract_trimmed varchar(455);
    
  2. Establézcalo en un valor no nulo para cada fila

    UPDATE table SET abstract_trimmed = 'No text';
    
  3. Agregue la restricción NOT NULL

    ALTER TABLE layer ALTER COLUMN abstract_trimmed SET NOT NULL;
    

¿Por qué?

Un valor predeterminado de columna solo se inserta en la columna con un INSERT . La etiqueta "valor" hará eso por ti, pero después se agrega la columna. Liquibase intenta agregar la columna en un solo paso, con NOT NULL restricción en su lugar:

ALTER TABLE layer ADD abstract_trimmed VARCHAR(455) NOT NULL;

... lo cual no es posible cuando la tabla ya contiene filas. Simplemente no es lo suficientemente inteligente.

Solución alternativa

Desde PostgreSQL 8.0 (así que casi para siempre), una alternativa sería agregar la nueva columna con un DEFAULT no nulo :

ALTER TABLE layer
ADD COLUMN abstract_trimmed varchar(455) NOT NULL DEFAULT 'No text';

El manual: