regclass在Postgresql中表示什么

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.

有用于定义隐式转换textregclass,所以如果你省略明确的演员和你调用接受一个函数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(...).

换一种说法:

  • 获取一个ab数组,列出我们可以访问的所有模式,并将每个条目与序列号配对,以获得它在数组中的位置
  • 搜索pg_class具有匹配名称的关系,并将每个关系与其命名空间(架构)关联
  • 按照其模式出现的顺序对剩余关系列表进行排序 search_path
  • 并选择第一场比赛

  • 另外,您还可以强制转换数字符号,即`select 1234 :: regclass`,如果您想知道“ pg_toast_”表与哪个表相关联,这将很有用。 (3认同)