CREATE TABLE语句中有以下行:
field1_id bigint DEFAULT nextval('table1_field1_id_seq'::regclass) NOT NULL,
regclass在上面是什么意思?增加::regclass
是绝对要求吗?
N.B:我看过Postgresql文档link,它讲述的是regclass
,但我不理解.
CREATE TABLE语句中有以下行:
field1_id bigint DEFAULT nextval('table1_field1_id_seq'::regclass) NOT NULL,
regclass在上面是什么意思?增加::regclass
是绝对要求吗?
N.B:我看过Postgresql文档link,它讲述的是regclass
,但我不理解.
不,当调用像nextval
这样接受regclass
参数的函数时,不需要转换为regclass
,因为有一个从text
到regclass
的隐式转换.在其他一些情况下,可能需要显式转换为regclass
.
Explanation:
::regclass
是演员阵容,就像::integer
一样.
regclass
是一种"神奇"的数据类型;它实际上是oid
的别名,或"对象标识符".参见文档中的Object identifier types.铸造到regclass
是一种快捷方式,表示"这是一个关系的名称,请将其转换为该关系的oid".对regclass
的强制转换知道search_path
,这与直接查询pg_class
以获取关系的oid
不同,因此对regclass的强制转换并不完全等同于子查询pg_class
.
桌子就是关系.序列和视图也是如此.因此,也可以通过强制转换到regclass来获得视图或序列的oid.
有为text
到regclass
定义的隐式强制转换,因此如果省略显式强制转换,并调用接受regclass
的函数,则强制转换将自动完成.例如,在nextval
次通话中,你确实需要它.
还有其他地方你可以go .例如,你不能直接比较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
与匹配名称的关系,并将每个关系与其命名空间(架构)关联search_path
中出现的顺序对剩余关系列表进行排序