Изменить столбцы PostgreSQL, используемые в представлениях
Я бы хотел, чтобы PostegreSQL немного расслабился. Каждый раз, когда я хочу изменить столбец, используемый в представлении, кажется, что мне нужно отбросить представление, изменить поле и затем воссоздать представление. Могу ли я отказаться от дополнительной защиты и просто сказать PostgreSQL, чтобы я сменил поле, а затем выяснил, как настроить представление?
Пояснение: я понимаю, что такое мнение. На самом деле, это потому, что представление похоже на подзапрос, и я хотел бы просто изменить базовые таблицы и сделать так, чтобы представление восприняло изменение.
Допустим, у меня есть следующее:
CREATE TABLE monkey
(
"name" character varying(50) NOT NULL,
)
CREATE OR REPLACE VIEW monkey_names AS
SELECT name
FROM monkey
Я действительно просто хочу сделать следующее в сценарии миграции, без необходимости отбрасывать и заново создавать представление.
ALTER TABLE monkey ALTER COLUMN "name" character varying(100) NOT NULL
1 ответ
Постоянное решение для этого случая
Чтобы вообще избежать проблемы, используйте тип данных 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
новый взгляд. Это никогда не удалит какие-либо данные из базовых таблиц. Тем не менее, будут отброшены все дополнительные атрибуты представления, которые также необходимо воссоздать.