【发布时间】:2012-06-12 18:22:15
【问题描述】:
有谁知道如何在 Postgres 9.1 中找到表的 OID?我正在编写一个更新脚本,它需要在尝试创建列之前测试表中是否存在列。这是为了防止在第一个错误之后运行脚本。
【问题讨论】:
有谁知道如何在 Postgres 9.1 中找到表的 OID?我正在编写一个更新脚本,它需要在尝试创建列之前测试表中是否存在列。这是为了防止在第一个错误之后运行脚本。
【问题讨论】:
要获取表 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)
【讨论】:
postgres 目录表pg_class 是您应该查看的。每个表应该有一行,表名在relname列,oid在隐藏列oid。
您可能还对pg_attribute 目录表感兴趣,该表每列包含一行。
请参阅:http://www.postgresql.org/docs/current/static/catalog-pg-class.html 和 http://www.postgresql.org/docs/current/static/catalog-pg-attribute.html
【讨论】:
pg_class 和pg_attribute 表上看过文档,但我不知道pg_class 表中有一个名为oid 的隐藏列。我无法从文档中找出 oid 的位置。谢谢!
pg_catalog 的架构,其中包含特定于数据库的目录表。
oid。
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';
【讨论】:
只是为了完成我想补充的可能性,存在一种用于删除列的语法,以免出错:
ALTER TABLE mytbl 如果存在 mycol,则删除列
见http://www.postgresql.org/docs/9.0/static/sql-altertable.html
然后您就可以安全地添加您的列了。
【讨论】: