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