web-dev-qa-db-ja.com

Postgres 9.1のテーブルのOID?

Postgres 9.1のテーブルのOIDを見つける方法を知っている人はいますか?列を作成する前に、テーブルの列の存在をテストする必要がある更新スクリプトを書いています。これは、最初のスクリプトの実行後にエラーが発生するのを防ぐためです。

30
Tony Vitabile

Postgresカタログテーブルpg_classはあなたが見るべきものです。 relname列にテーブル名、隠し列oidにOIDを含むテーブルごとに1行が必要です。

カタログテーブルはpostgresデータベースにあるため、アプリケーションデータベースではなく、必ずそれに接続してください。

また、pg_attributeカタログテーブル。テーブル列ごとに1行が含まれます。

参照: http://www.postgresql.org/docs/current/static/catalog-pg-class.html および http://www.postgresql.org/docs/current /static/catalog-pg-attribute.html

25
jmelesky

テーブルOIDを取得するには、 オブジェクト識別子タイプregclassにキャストします(同じDBに接続している間):

_SELECT 'mytbl'::regclass::oid;
_

これは、 _search_path_ に沿って指定された名前を持つ最初のテーブル(またはビューなど)を見つけるか、見つからない場合は例外を発生させます。

テーブル名をスキーマ修飾して、検索パスへの依存関係を削除します。

_SELECT 'myschema.mytbl'::regclass::oid;
_

Postgres9.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)
_
39

可能性を完全にするために、エラーを出さないために列をドロップする構文が存在することを付け加えます。

ALTER TABLE mytbl DROP COLUMN IF EXISTS mycol

http://www.postgresql.org/docs/9.0/static/sql-altertable.html を参照してください

その後、列を安全に追加できます。

2
Stefan
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';
1
user3132194