我在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”的快捷方式。与直接查询关系的regclass
的search_path
不同,对pg_class
的强制转换知道oid
,因此对regclass的强制转换并不完全等同于子查询pg_class
。
表是关系。序列和 View 也是如此。因此,您也可以通过强制转换为regclass来获得 View 或序列的oid。
为text
到regclass
定义了隐式强制转换,因此,如果您省略显式强制转换,并且您正在调用一个接受regclass
的函数,则自动完成强制转换。因此,例如,在nextval
调用中不需要它。
您可能还有其他地方。例如,您不能直接比较text
和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。换一种说法:
pg_class
以查找具有匹配名称的关系,并将每个名称与其 namespace (模式)相关联search_path
中的显示顺序排序关于postgresql - regclass在Postgresql中表示什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13289107/