如何获取Postgres表的OID?

问题描述 投票:0回答:5

有人知道如何在 Postgres 9.1 中查找表的 OID 吗?

我正在编写一个更新脚本,需要在尝试添加列之前测试表中是否存在该列。这是为了防止重复运行脚本时出现错误。

database postgresql postgresql-9.1 objectid zend-db-table
5个回答
79
投票

要获取表 OID,请转换为 对象标识符类型

regclass
(同时连接到同一个数据库!)。这会沿着
search_path
查找具有给定(非限定)名称的第一个表(或视图等),如果未找到,则会引发异常:

SELECT 'mytbl'::regclass::oid;

对表名进行架构限定以消除对搜索路径的依赖:

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

从 Postgres 9.4 开始,我们还可以使用

to_regclass()
,它会返回
null
,而不是在找不到表时引发异常:

SELECT to_regclass('myschema.mytbl');

参见:

然后查询目录表

pg_attribute
是否存在给定列:

SELECT EXISTS (
   SELECT 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
   );
;

这样你就得到:

  • 如果不存在该名称的表(或视图等),则会出现错误
  • false
    如果该列不存在
  • true
    如果该列存在(包括系统列)

43
投票

postgres 目录表

pg_class
是您应该查看的内容。每个表应该有一行,表名称位于列
relname
中,oid 位于隐藏列
oid
中。

您可能还对

pg_attribute
目录表感兴趣,其中每个表列一行。

请参阅:http://www.postgresql.org/docs/current/static/catalog-pg-class.htmlhttp://www.postgresql.org/docs/current/static/catalog-pg-属性.html


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

2
投票

为了完成可能性,我想补充一点,存在一种用于删除列的语法以避免错误:

更改表 mytbl 如果存在 mycol,则删除列

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

然后您就可以安全地添加您的列了。


0
投票

例如,您创建

person
表,如下所示:

CREATE TABLE person (
  id INTEGER,
  name VARCHAR(20)
);

现在,您可以使用

person
类型或
regclass
to_regclass()
类型获取
oid
表的OID,如下所示:

postgres=# SELECT 'public.person'::regclass::oid;
  oid
-------
 26880
(1 row)

或者:

postgres=# SELECT to_regclass('public.person')::oid;
 to_regclass
-------------
       26880
(1 row)

或者:

postgres=# SELECT CAST(CAST('public.person' AS regclass) AS oid);
  oid
-------
 26880
(1 row)

或者:

postgres=# SELECT CAST(to_regclass('public.person') AS oid);
 to_regclass
-------------
       26880
(1 row)

*备注:

  • 必须使用

    ::
    CAST()
    进行类型转换才能获取
    person
    表的OID。 *我的回答解释了如何进行类型转换。

  • 您可以省略架构

    public.

  • 医生解释了

    to_regclass()

  • 我的文章解释了如何通过类型转换获取函数的OID(对象标识符)。

另外,不使用

oid
类型无法获取
person
表的OID,如下所示:

postgres=# SELECT 'public.person'::regclass::oid;
 regclass
----------
 person
(1 row)

并且,在某些情况下您可以省略

oid
类型,如下所示。 *为下面的示例设置
oid
类型会得到相同的结果:

postgres=# SELECT relname FROM pg_class WHERE oid = 'public.person'::regclass;
 relname
---------
 person
(1 row)

并且,您仍然可以从

pg_class
获取 person 表的 OID,无需使用
regclass
类型或
to_regclass()
oid
类型,如下所示:

postgres=# SELECT oid FROM pg_class WHERE relname = 'person';
  oid
-------
 26880
(1 row)
© www.soinside.com 2019 - 2024. All rights reserved.