在CREATE语句中有以下一行:
field1_id bigint DEFAULT nextval('table1_field1_id_seq'::regclass) NOT NULL,
在上面,regclass是什么意思?添加::regclass
是绝对的要求吗?
N.B:,我看过Postgresql文档链接,它讲述了regclass
,但无法理解。
发布于 2012-11-08 13:38:07
不,在调用接受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'))
)
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(...)
等。
换言之:
pg_class
与匹配名称的关系,并将每个名称空间与其命名空间(模式)关联search_path
中出现的顺序对剩余关系列表进行排序发布于 2012-11-08 12:37:33
根据我对文档的了解,oid按类型细分。regclass
是表示关系的数据库对象(因此它们属于元数据表pg_class)。
它表示序列和DEFAULT
表达式之间的依赖关系(例如,如果在INSERT查询中没有提供显式值,则表示生成默认值的过程),因此,如果在序列上发出DROP SEQUENCE ...
,则查询不会传递,除非它是级联的(通过写入DROP SEQUENCE table1_field1_id_seq CASCADE
)。
https://stackoverflow.com/questions/13289107
复制相似问题