Câu trả lời ngắn
Thuộc tính "value" sẽ không hoạt động nếu bạn thêm ràng buộc not-null tại thời điểm tạo cột (điều này không được đề cập trong tài liệu ). SQL được tạo sẽ không thể thực thi.
Giải pháp thay thế
Cách giải quyết được mô tả trong câu hỏi là cách để thực hiện. SQL kết quả sẽ là:
-
Thêm cột
ALTER TABLE layer ADD COLUMN abstract_trimmed varchar(455);
-
Đặt nó thành giá trị khác rỗng cho mọi hàng
UPDATE table SET abstract_trimmed = 'No text';
-
Thêm ràng buộc NOT NULL
ALTER TABLE layer ALTER COLUMN abstract_trimmed SET NOT NULL;
Tại sao?
Mặc định cột chỉ được chèn vào cột bằng INSERT
. Thẻ "giá trị" sẽ làm điều đó cho bạn, nhưng sau cột được thêm vào. Liquibase cố gắng thêm cột trong một bước, với NOT NULL
ràng buộc tại chỗ:
ALTER TABLE layer ADD abstract_trimmed VARCHAR(455) NOT NULL;
... điều này không thể khi bảng đã chứa các hàng. Nó không đủ thông minh.
Giải pháp thay thế
Vì PostgreSQL 8.0 (đến nay gần như là mãi mãi), một giải pháp thay thế sẽ là thêm cột mới với DEFAULT
không null :
ALTER TABLE layer
ADD COLUMN abstract_trimmed varchar(455) NOT NULL DEFAULT 'No text';