Giải pháp lâu dài cho trường hợp này
Để tránh hoàn toàn sự cố, hãy sử dụng kiểu dữ liệu text
hoặc varchar
/ character varying
không có mã định độ dài thay vào đó là character varying(n)
. Đọc về các loại dữ liệu này trong sách hướng dẫn.
CREATE TABLE monkey(name text NOT NULL)
Nếu bạn thực sự muốn thực thi độ dài tối đa, hãy tạo CHECK
ràng buộc :
ALTER TABLE monkey
ADD CONSTRAINT monkey_name_len CHECK (length(name) < 101);
Bạn có thể thay đổi hoặc loại bỏ ràng buộc đó bất kỳ lúc nào mà không cần chạm vào các đối tượng phụ thuộc như khung nhìn và không buộc Postgres viết các hàng mới trong bảng do sự thay đổi loại (điều này không phải lúc nào cũng cần thiết trong phiên bản hiện đại của Postgres).
Giải thích chi tiết
Theo đề xuất của @Michael, tôi thêm một số thông tin chung:
Một khung nhìn trong PostgreSQL không chỉ là một "bí danh cho truy vấn con". Chế độ xem được triển khai dưới dạng các bảng đặc biệt với quy tắc ON SELECT TO my_view DO INSTEAD
. (Đó là lý do tại sao bạn có thể thay đổi chế độ xem bằng ALTER TABLE
lệnh.) Bạn có thể GRANT
đặc quyền cho nó, thêm nhận xét hoặc thậm chí xác định giá trị mặc định của cột (hữu ích cho quy tắc ON INSERT TO my_view DO INSTEAD...
). Đọc thêm trong sách hướng dẫn tại đây hoặc tại đây.
Nếu bạn thay đổi các đối tượng cơ bản, bạn cũng cần thay đổi truy vấn xác định của bất kỳ chế độ xem tùy thuộc nào. ALTER VIEW
câu lệnh chỉ có thể thay đổi các thuộc tính bổ trợ của một khung nhìn. Sử dụng CREATE OR REPLACE VIEW
để thay đổi truy vấn - nó sẽ giữ lại mọi thuộc tính bổ sung.
Tuy nhiên, nếu bạn muốn thay đổi kiểu dữ liệu của các cột kết quả (như trong trường hợp ở trên), hãy CREATE OR REPLACE VIEW
là không thể. Bạn phải DROP
cũ và CREATE
một cái nhìn mới. Điều này sẽ không bao giờ xóa bất kỳ dữ liệu nào của các bảng bên dưới. Nó sẽ Tuy nhiên, loại bỏ bất kỳ thuộc tính bổ sung nào của chế độ xem, chúng cũng phải được tạo lại.