PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

L'ajout d'une colonne non nullable à la table existante échoue. L'attribut value est-il ignoré ?

Réponse courte

L'attribut "value" ne fonctionnera pas si vous ajoutez une contrainte non nulle au moment de la création de la colonne (ceci n'est pas mentionné dans le documentation ). Le SQL généré ne pourra pas s'exécuter.

Solution

La solution de contournement décrite dans la question est la voie à suivre. Le SQL résultant sera :

  1. Ajouter la colonne

    ALTER TABLE layer ADD COLUMN abstract_trimmed varchar(455);
    
  2. Définissez-le sur une valeur non nulle pour chaque ligne

    UPDATE table SET abstract_trimmed = 'No text';
    
  3. Ajouter la contrainte NOT NULL

    ALTER TABLE layer ALTER COLUMN abstract_trimmed SET NOT NULL;
    

Pourquoi ?

Une colonne par défaut n'est insérée dans la colonne qu'avec un INSERT . La balise "value" le fera pour vous, mais après la colonne est ajoutée. Liquibase essaie d'ajouter la colonne en une seule étape, avec le NOT NULL contrainte en place :

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

... ce qui n'est pas possible lorsque le tableau contient déjà des lignes. Ce n'est tout simplement pas assez intelligent.

Solution alternative

Depuis PostgreSQL 8.0 (donc presque pour toujours maintenant), une alternative serait d'ajouter la nouvelle colonne avec un DEFAULT non nul :

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

Le manuel :