加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

regglass在Postgresql中是什么意思

发布时间:2020-12-13 16:40:57 所属栏目:百科 来源:网络整理
导读:我在CREATE TABLE语句中有以下行: field1_id bigint DEFAULT nextval('table1_field1_id_seq'::regclass) NOT NULL, 上述的意思是什么?添加:: regclass是绝对的要求吗? N.B:我看过Postgresql文档link,它告诉了regclass,但是不能理解它。 不,当调用像
我在CREATE TABLE语句中有以下行:
field1_id bigint DEFAULT nextval('table1_field1_id_seq'::regclass) NOT NULL,

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

N.B:我看过Postgresql文档link,它告诉了regclass,但是不能理解它。

不,当调用像接受regclass参数的nextval这样的函数时,您不需要转换regclass,因为从文本到regclass都有一个隐含的转换。在某些其他情况下,可能需要显式转换为regclass。

说明:

:: regclass是一个cast,像:: integer。

regclass是一个“魔术”数据类型;它实际上是一个别名为oid或“对象标识符”。请参阅文档中的Object identifier types。铸造成一个简单的方式是说“这个关系的名称,请将其转换成该关系的誓言”。注意regclass的注意事项是search_path,不像直接查询关系的oid的pg_class,所以转换为regclass并不完全等同于子查询pg_class。

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

为文本定义了隐式转换,因此如果省略显式转换,并且调用接受regclass的函数,转换将自动完成。所以你不需要它,例如,nextval调用。

还有其他地方你可以。例如,您无法直接与oid比较文本;所以你可以这样做:

regress=> select * from pg_class where oid = 'table1'::regclass;

但不是这样:

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大致相当于以下查询:

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(…)等的定义,请参见System information functions

换一种说法:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读