我在CREATE TABLE语句中有以下行:
field1_id bigint DEFAULT nextval('table1_field1_id_seq'::regclass) NOT NULL,
上述的意思是什么?添加:: regclass是绝对的要求吗?
不,当调用像接受regclass参数的nextval这样的函数时,您不需要转换regclass,因为从文本到regclass都有一个隐含的转换。在某些其他情况下,可能需要显式转换为regclass。
原文链接:https://www.f2er.com/postgresql/193172.html说明:
:: 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中出现的顺序对剩余关系列表进行排序并选择第一场比赛