Изменить столбцы PostgreSQL, используемые в представлениях - PullRequest
4 голосов
/ 15 декабря 2011

Я бы хотел, чтобы 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 Ответ

11 голосов
/ 16 декабря 2011

Постоянное решение для этого случая

Чтобы вообще избежать проблемы, используйте тип данных 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 новый вид.Это никогда не удалит какие-либо данные из базовых таблиц.Он будет отбрасывать любые дополнительные атрибуты представления, которые также должны быть воссозданы.

...