![]() |
气宇轩昂的大熊猫 · ConditionalOperators.I ...· 5 月前 · |
![]() |
活泼的茶壶 · QMap<结构体,结构体或变量>自定义排序 ...· 1 年前 · |
![]() |
小胡子的匕首 · 关于CoordinatorLayout在XM ...· 1 年前 · |
![]() |
非常酷的打火机 · activiti-modeler在线流程设计 ...· 1 年前 · |
在CREATE语句中有以下一行:
field1_id bigint DEFAULT nextval('table1_field1_id_seq'::regclass) NOT NULL,
在上面,regclass是什么意思?添加
::regclass
是绝对的要求吗?
N.B:
,我看过Postgresql文档
链接
,它讲述了
regclass
,但无法理解。
根据我对文档的了解,oid按类型细分。
regclass
是表示关系的数据库对象(因此它们属于元数据表pg_class)。
它表示序列和
DEFAULT
表达式之间的依赖关系(例如,如果在INSERT查询中没有提供显式值,则表示生成默认值的过程),因此,如果在序列上发出
DROP SEQUENCE ...
,则查询不会传递,除非它是级联的(通过写入
DROP SEQUENCE table1_field1_id_seq CASCADE
)。
不,在调用接受
regclass
参数的
nextval
这样的函数时,不需要将转换为
regclass
,因为从
text
到
regclass
有一个内隐式强制转换。在其他一些情况下,可能需要显式的
regclass
转换。
解释:
::regclass
是一个演员,就像
::integer
一样。
regclass
是一种“神奇”的数据类型;它实际上是
oid
或“对象标识符”的别名。请参阅文档中的
对象标识符类型
。转换到
regclass
是一种快捷的方式,可以说“这是关系的名称,请将其转换为该关系的逻辑”。
regclass
的强制转换知道
search_path
,不像直接查询关系的
oid
的
pg_class
,因此转换到regclass并不完全等同于子查询
pg_class
。
表是关系。序列和视图也是如此。因此,您也可以通过将视图或序列转换为regclass来获取视图或序列的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'))
![]() |
活泼的茶壶 · QMap<结构体,结构体或变量>自定义排序 - 简书 1 年前 |