Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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';