Невозможно создать таблицу из-за конфликта имен

Я пытаюсь создать таблицу в своей базе данных, и она дает мне следующую ошибку.

ERROR:  type "tbl_last_alert" already exists
HINT:  A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type.

Затем я подумал, что таблица должна существовать, поэтому я выполнил следующий запрос:

select * from pg_tables;

Но ничего не нашел. Затем я попробовал:

select * from tbl_last_alert;
ERROR:  relation "tbl_last_alert" does not exist

Любая идея, как это сортировать?

я пытаюсь переименовать тип

ALTER TYPE v4report.tbl_last_alert RENAME TO tbl_last_alert_old;
ERROR:  v4report.tbl_last_alert is a table's row type
HINT:  Use ALTER TABLE instead.

и получаю ошибку.


person smn_onrocks    schedule 12.03.2014    source источник


Ответы (4)


Postgres создает составной тип с одинаковым именем для каждой таблицы. Вот почему в сообщении об ошибке упоминается тип, а не таблица. По сути, имя таблицы не может конфликтовать с:

r = обычная таблица, i = индекс, S = последовательность, v = представление, m = материализованное представление, c = составной тип, t = таблица TOAST, f = внешняя таблица

Цитата из руководства по pg_class. Жирный акцент мой. Соответственно, вы можете найти любую конфликтующую запись с помощью этого запроса:

SELECT n.nspname AS schemaname, c.relname, c.relkind
FROM   pg_class c
JOIN   pg_namespace n ON n.oid = c.relnamespace
WHERE  relname = 'tbl_last_alert';

Это охватывает всех возможных конкурентов, а не только типы. Обратите внимание, что одно и то же имя может существовать несколько раз в нескольких схемах, но не в одной и той же схеме.

Излечивать

Если вы обнаружите конфликтующий составной тип, вы можете переименовать или удалить его, если он вам не нужен!

DROP TYPE tbl_last_alert;

Убедитесь, что схема типа является первым соответствием в вашем пути поиска, или укажите схему имени. Я добавил схему к запросу выше. Нравиться:

DROP TYPE public.tbl_last_alert;
person Erwin Brandstetter    schedule 12.03.2014
comment
drop type v4report.tbl_last_alert; ERROR: cache lookup failed for relation 19108 получаю ошибку есть идеи - person smn_onrocks; 12.03.2014
comment
`имя схемы | имя | relkind ------------+----------+--------- (0 rows) ` я получаю это - person smn_onrocks; 12.03.2014
comment
@smn_onrocks: Боюсь, в вашей БД что-то серьезно сломалось. Возможно, вы сможете исправить это, переиндексировав системные таблицы. Подробности в этом связанном ответе. Может быть быть аппаратной проблемой в корне этого. - person Erwin Brandstetter; 12.03.2014
comment
@smn_onrocks Прежде чем делать что-либо еще, следуйте советам в: wiki.postgresql.org/wiki/Corruption - person Craig Ringer; 12.03.2014
comment
@Erwin Brandstetter перепробовал все ваши советы, но все равно получает ошибку. - person smn_onrocks; 12.03.2014

Если вы не можете удалить тип, удалите его из pg_type:

DELETE FROM pg_type where typname~'tbl_last_alert';
person YRUsoDiao    schedule 27.11.2015

Ошибка называет это «типом»; у вас, вероятно, где-то есть тип с таким именем.

Используйте это в psql, чтобы узнать, что это такое:

\d tbl_last_alert
person Eevee    schedule 12.03.2014

Вы можете проверить это в таблице pg_type:

select * from pg_type where typname = 'tbl_last_alert'
person xdazz    schedule 12.03.2014
comment
select * from pg_type where typname = 'tbl_last_alert'; tbl_last_alert | 16716 | 10 | -1 | f | c | C | f | t | , | 19108 | 0 | 19109 | recor d_in | record_out | record_recv | record_send | - | - | - | d | x | f | \x1A | 0 | -1 | 0 | 0 | | После выполнения запроса я получаю это сейчас, я хочу удалить таблицу, как это сделать - person smn_onrocks; 12.03.2014
comment
@smn_onrocks drop type tbl_last_alert. - person xdazz; 12.03.2014
comment
drop type v4report.tbl_last_alert; ERROR: cache lookup failed for relation 19108 получаю ошибку есть идеи - person smn_onrocks; 12.03.2014