【问题标题】:How to determine the OID of a Postgres table?在 Postgres 9.1 中确定表的 OID?
【发布时间】:2012-06-12 18:22:15
【问题描述】:

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

【问题讨论】:

    标签: postgresql postgresql-9.1


    【解决方案1】:

    要获取表 OID,请转换为 object identifier type regclass(连接到同一个数据库时):

    SELECT 'mytbl'::regclass::oid;
    

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

    Schema-qualify 表名以去除对搜索路径的依赖:

    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)
    

    【讨论】:

      【解决方案2】:

      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-attribute.html

      【讨论】:

      • 我在pg_classpg_attribute 表上看过文档,但我不知道pg_class 表中有一个名为oid 的隐藏列。我无法从文档中找出 oid 的位置。谢谢!
      • 这不太准确。每个数据库都有一个名为 pg_catalog 的架构,其中包含特定于数据库的目录表。
      • 我第二个@TonyVitabile。这是我正在寻找的隐藏列oid
      • 删除了有关要连接的数据库的错误信息。只是注意到@JakobEgger 的评论现在看起来不合适。
      【解决方案3】:
      SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';
      

      【讨论】:

      • @eirikir Postgres 存储有关用户创建的每个表以及系统目录(实际上是表)pg_class 中的系统表的信息,因此您可以使用此查询获取 oid。这很有趣,但是关于 pg_class 的信息也存储在 pg_class 中: postgres=# SELECT oid, relname FROM pg_class WHERE relname = 'pg_class';类 |相对名称 ------+---------- 1259 | pg_class(1 行)
      • @ololobus 不,我相信 eirikir 的评论不是要求提供更多信息,而是对本答案作者的批评。 Stack Overflow 的创建者希望这个站点不仅仅是一个代码 sn-p 库。因此,Answers 应与任何示例代码一起提供一些解释。
      【解决方案4】:

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

      ALTER TABLE mytbl 如果存在 mycol,则删除列

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-29
        • 1970-01-01
        • 2012-05-01
        • 1970-01-01
        • 2012-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多