saj*_*i89 40 postgresql create-table
我在CREATE TABLE语句中有以下行:
field1_id bigint DEFAULT nextval('table1_field1_id_seq'::regclass) NOT NULL,
Run Code Online (Sandbox Code Playgroud)
regclass在上面表示什么?是否绝对需要添加::regclass?
注:我已经看到了PostgreSQL文档的链接,其讲述regclass,但不明白它.
Cra*_*ger 57
不,你regclass在调用一个nextval接受regclass参数的函数时不需要强制转换,因为有一个隐含的强制text转换regclass.在其他一些情况下,regclass可能需要明确的演员表.
说明:
::regclass像演员一样::integer.
regclass是一种"神奇"的数据类型; 它实际上是别名oid,或"对象标识符".请参阅文档中的对象标识符类型.施法regclass是一种快捷方式,说"这是关系的名称,请将其转换为该关系的oid".强制类型转换regclass都知道的search_path,不像查询pg_class了相关的oid直接,所以铸造regclass的不完全等同于subquerying pg_class.
表是关系.序列和视图也是如此.因此,您也可以通过强制转换来获取视图或序列的oid.
有用于定义隐式转换text到regclass,所以如果你省略明确的演员和你调用接受一个函数regclass中投是自动完成的.这样你就不会需要它,例如nextval调用.
还有其他地方你可以.例如,你不能text直接比较oid; 所以你可以这样做:
regress=> select * from pg_class where oid = 'table1'::regclass;
Run Code Online (Sandbox Code Playgroud)
但不是这个:
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';
Run Code Online (Sandbox Code Playgroud)
只是为了好玩,我试着写一个执行铸造的等效操作的查询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;
Run Code Online (Sandbox Code Playgroud)
除了它更短更快,更快.有关定义等,请参阅系统信息功能current_schemas(...).
换一种说法:
pg_class具有匹配名称的关系,并将每个关系与其命名空间(架构)关联search_path| 归档时间: |
|
| 查看次数: |
25480 次 |
| 最近记录: |