37

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

4

4 回答 4

59

要获取表 OID,请转换为对象标识符类型 regclass(连接到同一个数据库时):

SELECT 'mytbl'::regclass::oid;

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

模式限定表名以删除对搜索路径的依赖:

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

在 Postgres 9.4或更高版本中,您还可以使用to_regclass('myschema.mytbl'),如果找不到表,它不会引发异常:

那么只需要查询catalog表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)
于 2012-06-08T21:14:31.917 回答
37

pg_class您应该查看postgres 目录表。每个表应该有一行,表名在列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

于 2012-06-08T18:18:50.170 回答
5
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';
于 2015-10-07T07:00:35.090 回答
2

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

ALTER TABLE mytbl DROP COLUMN IF EXISTS mycol

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

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

于 2012-06-09T22:50:01.270 回答