Krótka odpowiedź
Atrybut „value” nie zadziała, jeśli podczas tworzenia kolumny dodajesz ograniczenie o wartości niezerowej (nie jest to wspomniane w dokumentacja ). Wygenerowany kod SQL nie będzie mógł zostać wykonany.
Obejście
Rozwiązanie opisane w pytaniu to droga do zrobienia. Wynikowy kod SQL będzie wyglądał następująco:
-
Dodaj kolumnę
ALTER TABLE layer ADD COLUMN abstract_trimmed varchar(455);
-
Ustaw wartość inną niż null dla każdego wiersza
UPDATE table SET abstract_trimmed = 'No text';
-
Dodaj ograniczenie NOT NULL
ALTER TABLE layer ALTER COLUMN abstract_trimmed SET NOT NULL;
Dlaczego?
Domyślna kolumna jest wstawiana tylko do kolumny z INSERT
. Tag „value” zrobi to za Ciebie, ale po kolumna jest dodawana. Liquibase próbuje dodać kolumnę w jednym kroku, z NOT NULL
ograniczenie w miejscu:
ALTER TABLE layer ADD abstract_trimmed VARCHAR(455) NOT NULL;
... co jest niemożliwe gdy tabela zawiera już wiersze. To po prostu nie jest wystarczająco inteligentne.
Alternatywne rozwiązanie
Od PostgreSQL 8.0 (tak więc prawie na zawsze) alternatywą byłoby dodanie nowej kolumny z niepustą DEFAULT
:
ALTER TABLE layer
ADD COLUMN abstract_trimmed varchar(455) NOT NULL DEFAULT 'No text';