发布
社区首页 >问答首页 >regclass在Postgresql中意味着什么?

regclass在Postgresql中意味着什么?
EN

Stack Overflow用户
提问于 2012-11-08 12:26:00
回答 2查看 49.7K关注 0票数 56

在CREATE语句中有以下一行:

代码语言:javascript
代码运行次数:0
复制
field1_id bigint DEFAULT nextval('table1_field1_id_seq'::regclass) NOT NULL,

在上面,regclass是什么意思?添加::regclass是绝对的要求吗?

N.B:,我看过Postgresql文档链接,它讲述了regclass,但无法理解。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-08 13:38:07

不,在调用接受regclass参数的nextval这样的函数时,不需要将转换为regclass,因为从textregclass有一个内隐式强制转换。在其他一些情况下,可能需要显式的regclass转换。

解释:

::regclass是一个演员,就像::integer一样。

regclass是一种“神奇”的数据类型;它实际上是oid或“对象标识符”的别名。请参阅文档中的对象标识符类型。转换到regclass是一种快捷的方式,可以说“这是关系的名称,请将其转换为该关系的逻辑”。regclass的强制转换知道search_path,不像直接查询关系的oidpg_class,因此转换到regclass并不完全等同于子查询pg_class

表是关系。序列和视图也是如此。因此,您也可以通过将视图或序列转换为regclass来获取视图或序列的oid。

有为textregclass定义的隐式转换,因此如果省略显式强制转换,并且调用接受regclass的函数,则强制转换将自动完成。因此,您不需要它,例如,nextval调用。

还有其他地方你可以。例如,您不能直接将textoid进行比较;因此可以这样做:

代码语言:javascript
代码运行次数:0
复制
regress=> select * from pg_class where oid = 'table1'::regclass;

但不是这个:

代码语言:javascript
代码运行次数:0
复制
regress=> select * from pg_class where oid = 'table1';
ERROR:  invalid input syntax for type oid: "table1"
LINE 1: select * from pg_class where oid = 'table1';

只是为了好玩,我尝试编写一个查询,该查询执行与向regclass转换相同的操作。不要使用它,它主要是为了好玩,并试图演示实际发生的事情。除非你真的对Pg的胆量感兴趣,否则你可以在这里停止阅读。

据我所知,'sequence_name'::regclass::oid大致相当于以下查询:

代码语言:javascript
代码运行次数:0
复制
WITH sp(sp_ord, sp_schema) AS (
  SELECT 
    generate_series(1, array_length(current_schemas('t'),1)),
    unnest(current_schemas('t'))
)
SELECT c.oid
FROM pg_class c INNER JOIN pg_namespace n ON (c.relnamespace = n.oid)
INNER JOIN sp ON (n.nspname = sp.sp_schema)
WHERE c.relname = 'sequence_name'
ORDER BY sp.sp_ord
LIMIT 1;

只不过它要短得多,快得多。有关系统信息功能的定义,请参阅current_schemas(...)等。

换言之:

  • 获取一个ab数组,列出我们可以访问的所有模式,并将每个条目与数组中其位置的序号配对。
  • 搜索pg_class与匹配名称的关系,并将每个名称空间与其命名空间(模式)关联
  • 按模式在search_path中出现的顺序对剩余关系列表进行排序
  • 选择第一场比赛
票数 82
EN

Stack Overflow用户

发布于 2012-11-08 12:37:33

根据我对文档的了解,oid按类型细分。regclass是表示关系的数据库对象(因此它们属于元数据表pg_class)。

它表示序列和DEFAULT表达式之间的依赖关系(例如,如果在INSERT查询中没有提供显式值,则表示生成默认值的过程),因此,如果在序列上发出DROP SEQUENCE ...,则查询不会传递,除非它是级联的(通过写入DROP SEQUENCE table1_field1_id_seq CASCADE)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13289107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档