PG的oid和typname是一一对应关系吗,详细介绍oid和typname作用
时间: 2024-03-28 16:42:27 浏览: 59
PG的oid和typname不一定是一一对应的关系。
在PostgreSQL中,oid是一个唯一的标识符,用于标识数据库中的每个对象(如表、列、序列等)。每个对象都有一个唯一的oid,它可以用于在数据库中查找或引用该对象。但是,oid并不是直接暴露给用户的,而是被封装在系统函数中使用。
相比之下,typname是类型名称,它是用户定义的数据类型的名称。它可以用于在SQL语句中定义列、变量、函数参数等。例如,我们可以使用typname定义一个自定义数据类型:
```sql
CREATE TYPE mytype AS (id int, name text);
```
这样就定义了一个名为mytype的自定义数据类型,它包含id和name两个字段。
在PostgreSQL中,每种数据类型都有一个对应的oid,可以使用系统函数pg_type来查找:
```sql
SELECT typname, oid FROM pg_type;
```
这样就可以查看所有数据类型的名称和对应的oid。
需要注意的是,由于PostgreSQL支持用户定义的数据类型,因此不同的用户可能会定义相同名称的数据类型,从而导致typname不唯一。但是,每个数据类型的oid仍然是唯一的。
因此,可以说oid是一个对象的唯一标识符,而typname是用户定义数据类型的名称。它们都有不同的作用,但在某些情况下可能会有重叠。
相关问题
select c.relname as "表名", cast(obj_description(c.oid) as varchar) as "表注释", a.attnum as "序号", a.attname as "字段名称", d.description as "字段注释", concat_ws('', t.typname, SUBSTRING(format_type(a.atttypid, a.atttypmod) from '\(.*\)')) as "字段类型" from pg_attribute a left join pg_description d on d.objoid = a.attrelid and d.objsubid = a.attnum left join pg_class c on a.attrelid = c.oid left join pg_type t on a.atttypid = t.oid where a.attnum >= 0 and c.relname in('ods_vem_busi_base') order by c.relname desc, a.attnum asc;这段pgsql查出的表结构每个字段都重复出现一次,这是为什么
这是因为这段 SQL 语句使用了多个表之间的连接查询,其中包含了 pg_attribute、pg_description、pg_class、pg_type 这些表。而每个字段都需要从不同的表中获取不同的信息,因此需要在每个表中查询一遍。这就导致了每个字段都会在结果集中出现多次。但是,每个字段所对应的信息都不相同,因此这种重复是必要的。
select tablename from pg_tables where schemaname='public' and tablename not in (SELECT child.relname AS child_table FROM pg_inherits JOIN pg_class parent ON pg_inherits.inhparent = parent.oid JOIN pg_class child ON pg_inherits.inhrelid = child.oid JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace) order by 1;
这是一条 PostgreSQL 数据库查询语句,用于查找指定 schema(在此为 public)下的所有表名,并排除继承关系的表。其具体作用如下:
1. 通过 `pg_tables` 系统目录表,筛选指定 schema(在此为 public)下的所有表名,使用 `schemaname` 和 `tablename` 进行筛选。
2. 使用子查询查找继承关系的表,即父表和子表,使用 `pg_inherits` 系统目录表来查找这个关系。通过 `inhparent` 和 `inhrelid` 可以找到父表和子表的 `oid`。然后使用 `pg_class` 系统目录表找到表的详细信息,包括表名和 schema。最后,使用 `pg_namespace` 系统目录表来查找 schema 的详细信息,并与表的详细信息一起使用以获取完整的表名。
3. 将不在子查询结果中的所有表名按照字母顺序排序,并返回结果。
该查询语句的作用是查找指定 schema 下的所有非继承关系的表名。在数据迁移过程中,可以使用此查询来列出需要进行数据清理和转换的表,以便执行后续的数据迁移操作。
阅读全文