Кто-нибудь знает, как найти OID таблицы в Postgres 9.1? Я пишу обновление script, которому необходимо проверить наличие столбца в таблице, прежде чем он попытается создать столбец. Это делается для предотвращения запуска script после первого из ошибок.
Определение OID таблицы в Postgres 9.1?
Ответ 1
Таблица каталога 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
Ответ 2
Существует простой способ получить OID таблицы. Передать в класс идентификатора объекта regclass
(при подключении к соответствующему БД):
SELECT 'mytbl'::regclass::oid;
Это значение по умолчанию относится к первой схеме в search_path
или вызывает исключение, если не найдено.
Или схема-квалифицировать явно:
SELECT 'myschema.mytbl'::regclass::oid;
Затем вам нужно только проверить таблицу каталога pg_attribute
для существования столбца:
SELECT TRUE AS col_exists
FROM pg_attribute
WHERE attrelid = '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)
В Postgres 9.4 или позже вы также можете использовать to_regclass('mytbl')
, который не вызывает исключение, если таблица не найдена:
Ответ 3
Просто для завершения возможностей, которые я хотел бы добавить, существует синтаксис для удаления столбцов, чтобы не было ошибок:
ALTER TABLE mytbl DROP COLUMN IF EXISTS mycol
См. http://www.postgresql.org/docs/9.0/static/sql-altertable.html
Затем вы можете безопасно добавить свой столбец.
Ответ 4
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';