有谁知道如何在Postgres 9.1中找到表的OID?我正在编写一个更新脚本,需要在尝试创建列之前测试表中是否存在列。这是为了防止脚本在第一次出错后运行。
答案 0 :(得分:37)
要获取表格OID,请转到object identifier type regclass
(连接到同一个数据库时):
SELECT 'mytbl'::regclass::oid;
这会找到search_path
上具有给定名称的第一个表(或视图等),或者如果找不到则会引发异常。
模式限定表名以删除对搜索路径的依赖:
SELECT 'myschema.mytbl'::regclass::oid;
在Postgres 9.4 或更高版本中,您还可以使用to_regclass('myschema.mytbl')
,如果找不到该表,则不会引发异常:
然后,您只需要查询目录表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)
答案 1 :(得分:23)
你应该看看postgres目录表pg_class
。每个表应该有一行,表名在relname
列中,而oid在隐藏列oid
中。
目录表位于postgres
数据库中,因此请确保连接到该数据库,而不是应用程序数据库。
您可能也对pg_attribute
目录表感兴趣,每个表列包含一行。
请参阅:http://www.postgresql.org/docs/current/static/catalog-pg-class.html和http://www.postgresql.org/docs/current/static/catalog-pg-attribute.html
答案 2 :(得分:2)
只是为了完成我想添加的可能性,存在一种删除列的语法,以便不会出错:
ALTER TABLE mytbl DROP COLUMN如果存在mycol
请参阅http://www.postgresql.org/docs/9.0/static/sql-altertable.html
然后您可以安全地添加列。
答案 3 :(得分:1)
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';