37

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

4

4 に答える 4

59

テーブル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)
于 2012-06-08T21:14:31.917 に答える
37

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

于 2012-06-08T18:18:50.170 に答える
5
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';
于 2015-10-07T07:00:35.090 に答える
2

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.

于 2012-06-09T22:50:01.270 に答える