我在CREATE TABLE语句中有以下一行:

field1_id bigint DEFAULT nextval('table1_field1_id_seq'::regclass) NOT NULL,

regclass在上面表示什么?添加::regclass是绝对要求吗?

N.B:我看过Postgresql文档link,它介绍了regclass,但听不懂。

最佳答案

不,在调用像regclass这样的接受nextval参数的函数时,不需要强制转换为regclass,因为从text强制转换为regclass是隐式的。在其他一些上下文中,可能需要显式转换为regclass

说明:
::regclass是强制转换,类似于::integer
regclass是一种“魔术”数据类型;它实际上是oid或“对象标识符”的别名。请参阅文档中的Object identifier types。强制转换为regclass是说“此关系的名称,请将其转换为该关系的oid”的快捷方式。与直接查询关系的regclasssearch_path不同,对pg_class的强制转换知道oid,因此对regclass的强制转换并不完全等同于子查询pg_class

表是关系。序列和 View 也是如此。因此,您也可以通过强制转换为regclass来获得 View 或序列的oid。

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

您可能还有其他地方。例如,您不能直接比较textoid;因此您可以执行以下操作:

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以查找具有匹配名称的关系,并将每个名称与其 namespace (模式)相关联
  • 按剩余关系列表在search_path中的显示顺序排序
  • 并选择第一个匹配的
  • 关于postgresql - regclass在Postgresql中表示什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13289107/

    10-13 02:16