Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 确定Postgres 9.1中表格的OID?_Postgresql_Postgresql 9.1 - Fatal编程技术网

Postgresql 确定Postgres 9.1中表格的OID?

Postgresql 确定Postgres 9.1中表格的OID?,postgresql,postgresql-9.1,Postgresql,Postgresql 9.1,有人知道如何在Postgres 9.1中查找表的OID吗?我正在编写一个更新脚本,在它尝试创建列之前,需要测试表中是否存在列。这是为了防止脚本在第一次运行后出错。您应该查看postgres目录表pg_类。每个表应该有一行,表名在列relname中,oid在隐藏列oid中 您可能还对pg_属性目录表感兴趣,该表每列包含一行 请参见:和要获取表OID,请在连接到同一DB时强制转换到regclass: SELECT 'mytbl'::regclass::oid; 这将沿查找第一个具有给定名称的表或视

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

您应该查看postgres目录表pg_类。每个表应该有一行,表名在列relname中,oid在隐藏列oid中

您可能还对pg_属性目录表感兴趣,该表每列包含一行


请参见:和

要获取表OID,请在连接到同一DB时强制转换到regclass:

SELECT 'mytbl'::regclass::oid;
这将沿查找第一个具有给定名称的表或视图等,如果未找到,将引发异常

架构限定表名以删除对搜索路径的依赖关系:

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

然后,您只需查询目录表中是否存在该列:

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)

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

更改表mytbl 如果存在mycol,则删除列


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

我看到了pg_类和pg_属性表上的文档,但我不知道pg_类表中有一个名为oid的隐藏列。我无法从文件中找出oid的位置。谢谢这不太准确。每个数据库都有一个名为pg_catalog的模式,其中包含特定于数据库的目录表。我正在查找的是隐藏列oid。删除了有关要连接的数据库的错误信息。请注意,@JakobEgger的注释现在似乎不合适了。@eirikir Postgres存储有关用户创建的每个表的信息,以及有关system catalog Actual table pg_类中的系统表的信息,因此您可以使用此查询获取oid。有趣的是,关于pg_类的信息也存储在pg_类中:postgres=SELECT oid,relname FROM pg_类,其中relname='pg_类';oid | relname---+----1259 | pg|U类1row@ololobus不,我相信eirikir的评论不是要求提供更多信息,而是对这个答案的作者的批评。Stack Overflow的创建者希望此站点不仅仅是一个代码段库。因此,答案应该与示例代码一起提供一些解释。
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';