Determining the OID of a table in Postgres 9.1?

本小妞迷上赌 提交于 2019-11-27 12:47:16

问题


Does anyone know how to find the OID of a table in Postgres 9.1? I am writing an update script that needs to test for the existence of a column in a table before it tries to create the column. This is to prevent run of the script after the first from erroring out.


回答1:


The postgres catalog table pg_class is what you should look at. There should be one row per table, with the table name in the column relname, and the oid in the hidden column oid.

The catalog tables are in the postgres database, so make sure to connect to that, rather than your application database.

You may also be interested in the pg_attribute catalog table, which includes one row per table column.

See: http://www.postgresql.org/docs/current/static/catalog-pg-class.html and http://www.postgresql.org/docs/current/static/catalog-pg-attribute.html




回答2:


To get a table OID, cast to the object identifier type regclass (while connected to the same DB):

SELECT 'mytbl'::regclass::oid;

This finds the first table (or view, etc.) with the given name along the search_path or raises an exception if not found.

Schema-qualify the table name to remove the dependency on the search path:

SELECT 'myschema.mytbl'::regclass::oid;

In Postgres 9.4 or later you can also use to_regclass('myschema.mytbl'), which doesn't raise an exception if the table is not found:

  • How to check if a table exists in a given schema

Then you only need to query the catalog table pg_attribute for the existence of the column:

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)



回答3:


SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';



回答4:


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.



来源:https://stackoverflow.com/questions/10953123/determining-the-oid-of-a-table-in-postgres-9-1

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!