Постоянное решение для этого случая
Чтобы вообще избежать проблемы, используйте тип данных text
или varchar
/ character varying
без спецификатора длины вместо character varying(n)
. Прочтите об этих типах данных в руководстве.
CREATE TABLE monkey(name text NOT NULL)
Если вы действительно хотите применить максимальную длину, создайте ограничение CHECK
:
ALTER TABLE monkey
ADD CONSTRAINT monkey_name_len CHECK (length(name) < 101);
Вы можете изменить или удалить это ограничение в любое время, не касаясь таких объектов, как представления, и не заставляя Postgres писать новые строки в таблице из-за изменения типа (что не всегданеобходимо больше в современной версии Postgres).
Подробное объяснение
В соответствии с предложением @Michael я добавлю более общую информацию:
Представление в PostgreSQL - это не просто«псевдоним подзапроса».Представления реализованы в виде специальных таблиц с правилом ON SELECT TO my_view DO INSTEAD
.(Вот почему вы можете изменять представления с помощью команды ALTER TABLE
.) Вы можете GRANT
привилегий для нее, добавлять комментарии или даже определять значения по умолчанию для столбцов (полезно для правила ON INSERT TO my_view DO INSTEAD...
).Подробнее читайте в руководстве здесь или здесь .
Если вы меняете базовые объекты, вам также нужно изменить определяющий запрос для любого зависимого представления.Оператор ALTER VIEW
может изменять только вспомогательные атрибуты представления.Используйте CREATE OR REPLACE VIEW
для изменения запроса - он сохранит любые дополнительные атрибуты.
Однако, если вы хотите изменить типы данных результирующих столбцов (как в данном случае), CREATE OR REPLACE VIEW
невозможно.Вы должны DROP
старый и CREATE
новый вид.Это никогда не удалит какие-либо данные из базовых таблиц.Он будет отбрасывать любые дополнительные атрибуты представления, которые также должны быть воссозданы.