关于postgresql:确定Postgres 9.1中表的OID?

Determining the OID of a table in Postgres 9.1?

有谁知道如何在Postgres 9.1中找到表的OID? 我正在编写一个更新脚本,需要在尝试创建列之前测试表中是否存在列。 这是为了防止脚本在第一次出错后运行。


要获取表OID,请转换为对象标识符类型regclass(同时连接到同一个DB):

1
SELECT 'mytbl'::regclass::oid;

这将找到沿search_path具有给定名称的第一个表(或视图等),或者如果未找到则引发异常。

模式限定表名以删除对搜索路径的依赖:

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

在Postgres 9.4或更高版本中,您还可以使用to_regclass('myschema.mytbl'),如果找不到表,则不会引发异常:

  • 如何检查给定模式中是否存在表

然后,您只需要查询目录表pg_attribute是否存在该列:

1
2
3
4
5
6
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是你应该看到的。每个表应该有一行,表名在relname列中,而oid在隐藏列oid中。

目录表位于postgres数据库中,因此请确保连接到该数据库,而不是应用程序数据库。

您可能还对pg_attribute目录表感兴趣,该表包含每个表列一行。

请参阅:http://www.postgresql.org/docs/current/static/catalog-pg-class.html和http://www.postgresql.org/docs/current/static/catalog-pg-attribute.html


只是为了完成我想要添加的可能性,存在一种删除列的语法,以便不会出错:

ALTER TABLE mytbl
DROP COLUMN如果存在mycol

见http://www.postgresql.org/docs/9.0/static/sql-altertable.html

然后,您可以安全地添加列。


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