Не могу переименовать столбцы в представлениях PostgreSQL с помощью CREATE OR REPLACE

37

В PostreSQL 8.3 я пытаюсь создать представление, которое будет выглядеть как существующая таблица, но иметь разные имена столбцов.

Это работает

CREATE OR REPLACE VIEW gfam.nice_builds AS 
 SELECT (family_tree.family_tree_id) as x,
        family_tree.family_tree_name, family_tree.family_tree_description
   FROM gfam.family_tree;

Выше приведено дублирование таблицы family_tree, но следующая попытка не удалась:

CREATE OR REPLACE VIEW gfam.nice_builds AS 
 SELECT (family_tree.family_tree_id) as x,
        family_tree.family_tree_name, family_tree.family_tree_description
   FROM gfam.family_tree;
  • ОШИБКА: невозможно изменить имя столбца представления "family_tree_id"

Как я могу переименовать столбцы?

Александр Левчук
источник

Ответы:

45

Я могу воспроизвести вашу ошибку ... в моем случае я сначала создал столбец как «date», а затем как «x» (пытался определить, была ли это проблема с зарезервированным словом; это не так:

ERROR:  cannot change name of view column "date" to "x"

Если вы введете drop viewсначала, это позволит вам заново создать представление с измененным именем. Я понятия не имею, почему create or replaceне буду этого делать.


Разъяснение Колин Т Харта :

ДокументацииCREATE VIEW объясняет это очень хорошо, я думаю:

Новый запрос должен генерировать те же столбцы, которые были созданы существующим запросом представления (то есть те же имена столбцов в том же порядке и с теми же типами данных), но он может добавить дополнительные столбцы в конец списка.

Джо
источник
Действительно, вы должны добавить новый столбец в конец списка столбцов SELECT , иначе вы получите ошибку!
1
Немного не по теме: я столкнулся с подобной проблемой, когда пытался объединить данные из двух таблиц с помощью представления. Но на самом деле у меня были разные типы ( VARCHARв первой и TEXTво второй таблице) столбцов с одинаковыми именами. Я потратил много времени на исследование, пока не заметил, что IDE отображает VARCHARобе таблицы! Только чистый pg_dumpпомог мне.
flaz14
31

Вы также можете использовать ALTER TABLE tbl RENAME COLUMN foo TO barдля переименования столбцов представления.

Питер Айзентраут
источник
Что tblздесь? это фактическая таблица, для которой создается представление, или это имя представления?
Евгений Коньков
@EugenKonkov Кажется, это мнение. Я проверил это, и он работает
DatabaseShouter