有人知道如何在 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
然后您就可以安全地添加您的列了。
例如,您创建
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)