Postgres 9.1 でテーブルの OID を見つける方法を知っている人はいますか? 列を作成する前に、テーブルに列が存在するかどうかをテストする必要がある更新スクリプトを作成しています。これは、最初のスクリプトの実行後にエラーが発生するのを防ぐためです。
4 に答える
テーブルOIDを取得するには、(同じDBに接続しているときに)オブジェクト識別子タイプ にキャストします。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)
postgres のカタログ テーブルpg_class
を確認する必要があります。テーブルごとに 1 つの行があり、テーブル名が columnrelname
にあり、oid が非表示の column にありますoid
。
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
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';
Just to complete the possibilities I'd like to add that there exists a syntax for dropping columns in order to no error out:
ALTER TABLE mytbl DROP COLUMN IF EXISTS mycol
See http://www.postgresql.org/docs/9.0/static/sql-altertable.html
Then you can safely add your column.