Определение 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
Тогда вы можете смело добавлять свою колонку.