Postgres 9.1のテーブルのOIDを見つける方法を知っている人はいますか?列を作成する前に、テーブルの列の存在をテストする必要がある更新スクリプトを書いています。これは、最初のスクリプトの実行後にエラーが発生するのを防ぐためです。
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
テーブル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)
_
可能性を完全にするために、エラーを出さないために列をドロップする構文が存在することを付け加えます。
ALTER TABLE mytbl DROP COLUMN IF EXISTS mycol
http://www.postgresql.org/docs/9.0/static/sql-altertable.html を参照してください
その後、列を安全に追加できます。
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';