PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Không thêm được cột không thể null vào bảng hiện có. Thuộc tính giá trị có bị bỏ qua không?

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à:

  1. Thêm cột

    ALTER TABLE layer ADD COLUMN abstract_trimmed varchar(455);
    
  2. Đặt nó thành giá trị khác rỗng cho mọi hàng

    UPDATE table SET abstract_trimmed = 'No text';
    
  3. 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';

Hướng dẫn sử dụng:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Danh sách Python đến Mảng PostgreSQL

  2. Django ORM đọc sai chuỗi PostgreSQL?

  3. psql:FATAL:xác thực mật khẩu không thành công cho người dùng windows 8

  4. kiểu do người dùng xác định làm tham số đầu vào trong hàm PostgreSQL

  5. Cách trả về kết quả truy vấn dưới dạng danh sách được phân tách bằng dấu phẩy trong PostgreSQL