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 :
-
Ajouter la colonne
ALTER TABLE layer ADD COLUMN abstract_trimmed varchar(455);
-
Définissez-le sur une valeur non nulle pour chaque ligne
UPDATE table SET abstract_trimmed = 'No text';
-
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';