Как переименовать таблицу PostgreSQL с помощью префикса подчеркивания?

У меня есть база данных, основанная на системе PostgreSQL, и я ее поддерживаю, поэтому хочу изменить таблицы и общую схему. Для этого я подумал о переименовании старых таблиц, чтобы они имели префикс в качестве подчеркивания. Но это не работает

DROP TABLE IF EXISTS _my_table; -- table does not exists, this does nothing

ALTER TABLE my_table
  RENAME TO _my_table;

Результат запроса следующий:

ВНИМАНИЕ: таблица "_my_table" не существует, пропуская ОШИБКУ:
тип "_my_table" уже существует
********** Ошибка **********

ОШИБКА: тип "_my_table" уже существует Состояние SQL: 42710

Таблица "_my_table" является поддельным именем, но эта ошибка воспроизводится путем фактического создания таблицы "_my_table" и запуска того же сценария, описанного выше.

Я использую pgAdmin III для доступа к таблицам базы данных, и использование операции "переименовать" приводит к той же ошибке. Документация postgresql для метода alter table явно не говорит мне об этой конкретной проблеме: http://www.postgresql.org/docs/9.3/static/sql-altertable.html

Мне действительно нужно использовать префикс типа "резервное копирование" вместо "_"? Или можно было бы переименовать его, меня интересует только сохранение информации в таблице при минимальных изменениях в названии таблицы.

2 ответа

Решение

Вы не можете просто поставить подчеркивание перед существующим именем таблицы, потому что у каждой таблицы есть связанный тип, который является... нижним подчеркиванием перед именем таблицы. Вы можете проверить это в pg_catalog.pg_type Таблица. Иметь имя таблицы, начинающееся с подчеркивания, не проблема, но внутренняя процедура заключается в том, что новая таблица создается физически из старой таблицы, и только когда старая таблица больше не используется другими процессами, старая таблица и связанный тип, будет удален. Отсюда ошибка, ссылающаяся на тип (а не на отношение).

Так что если вы действительно хотите сохранить старое имя с подчеркиванием, вы должны сначала ALTER TABLE на некоторое временное имя, а затем ALTER TABLE на подчеркивание + оригинальное имя. Или просто используйте другой префикс...

ОШИБКА: тип "_my_table" уже существует

И таблицы, и типы хранятся во внутренней таблице pg_class. Требуется уникальное имя, поэтому вы получаете это сообщение об ошибке.

Другие вопросы по тегам