有人知道如何在 Postgres 9.1 中查找表的 OID 吗?
我正在编写一个更新脚本,需要在尝试添加列之前测试表中是否存在该列。这是为了防止重复运行脚本时出现错误。
要获取表 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
如果该列存在(包括系统列)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-属性.html
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';
为了完成可能性,我想补充一点,存在一种用于删除列的语法以避免错误:
更改表 mytbl 如果存在 mycol,则删除列
参见 http://www.postgresql.org/docs/9.0/static/sql-altertable.html
然后您就可以安全地添加您的列了。