Определение OID таблицы в Postgres 9.1?

Кто-нибудь знает, как найти OID таблицы в Postgres 9.1? Я пишу скрипт обновления, который должен проверить наличие столбца в таблице, прежде чем он попытается создать столбец. Это должно предотвратить запуск сценария после первого сбоя.

4 ответа

Решение

Таблица каталога postgres pg_class это то, на что вы должны смотреть. В каждой таблице должна быть одна строка с именем таблицы в столбце. relnameи oid в скрытой колонке oid,

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

Вы также можете быть заинтересованы в pg_attribute таблица каталога, которая включает одну строку на столбец таблицы.

См. http://www.postgresql.org/docs/current/static/catalog-pg-class.html и http://www.postgresql.org/docs/current/static/catalog-pg-attribute.html

Чтобы получить OID таблицы, приведите тип идентификатора объекта regclass (при подключении к той же БД):

SELECT 'mytbl'::regclass::oid;

Это находит первую таблицу (или представление и т. Д.) С заданным именем вдоль search_path или вызывает исключение, если не найдено.

Укажите имя таблицы в схеме, чтобы удалить зависимость от пути поиска:

SELECT 'myschema.mytbl'::regclass::oid;

В Postgres 9.4 или новее вы также можете использовать to_regclass('myschema.mytbl'), который не вызывает исключения, если таблица не найдена:

Тогда вам нужно только запросить таблицу каталога pg_attribute для существования колонки:

SELECT TRUE AS col_exists
FROM   pg_attribute 
WHERE  attrelid = 'myschema.mytbl'::regclass
AND    attname  = 'mycol'
AND    NOT attisdropped  -- no dropped (dead) columns
-- AND attnum > 0        -- no system columns (you may or may not want this)
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';

Просто чтобы завершить возможности, я хотел бы добавить, что существует синтаксис для удаления столбцов, чтобы не было ошибок:

ALTER TABLE mytbl DROP COLUMN ЕСЛИ СУЩЕСТВУЕТ mycol

См. http://www.postgresql.org/docs/9.0/static/sql-altertable.html

Тогда вы можете смело добавлять свою колонку.

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