CREATE TABLE语句中有以下行:

field1_id bigint DEFAULT nextval('table1_field1_id_seq'::regclass) NOT NULL,

regclass在上面是什么意思?增加::regclass是绝对要求吗?

N.B:我看过Postgresql文档link,它讲述的是regclass,但我不理解.

推荐答案

不,当调用像nextval这样接受regclass参数的函数时,不需要转换为regclass,因为有一个从textregclass的隐式转换.在其他一些情况下,可能需要显式转换为regclass.

Explanation:

::regclass是演员阵容,就像::integer一样.

regclass是一种"神奇"的数据类型;它实际上是oid的别名,或"对象标识符".参见文档中的Object identifier types.铸造到regclass是一种快捷方式,表示"这是一个关系的名称,请将其转换为该关系的oid".对regclass的强制转换知道search_path,这与直接查询pg_class以获取关系的oid不同,因此对regclass的强制转换并不完全等同于子查询pg_class.

桌子就是关系.序列和视图也是如此.因此,也可以通过强制转换到regclass来获得视图或序列的oid.

有为textregclass定义的隐式强制转换,因此如果省略显式强制转换,并调用接受regclass的函数,则强制转换将自动完成.例如,在nextval次通话中,你确实需要它.

还有其他地方你可以go .例如,你不能直接比较textoid;所以你可以这样做:

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.

换句话说:

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

Postgresql相关问答推荐

Postgresql函数返回值别名

计算两个子查询之间的差异

Postgresql我必须创建一个索引还是已经有一个索引了?

PostgreSQL:重新创建主键值以匹配记录计数

如何删除Devtainer之前创建的PostgreSQL数据库?

postgresql中多个左连接的空结果

是否可以短时间运行 VACUUM FULL 并获得一些好处?

转换数组类型

在postgresql中按经纬度查找最近的位置

如何将 postgres 数据库转换为 sqlite

如何将 DELETE 的返回值插入到 postgresql 中的 INSERT 中?

在查询中的复合外键/主键列上连接表

mysql_insert_id 替代 postgresql

?(问号)运算符在 Rails 中查询 Postgresql JSONB 类型

gem install pg 无法绑定到 libpq

如何在 Postgresql 中正确使用 FETCH FIRST?

try 为 ror 应用程序设置 postgres,出现错误 - fe_sendauth:no password supplied

如何查询前 10 行,下一次从表中查询其他 10 行

PostgreSQL 9.1:如何连接数组中的行而不重复,加入另一个表

如何获取一个月的天数?