postgresql 里面的pg_class、pg_attribute 、pg_description 都是什么
时间: 2024-05-21 20:18:49 浏览: 217
这三个都是 PostgreSQL 数据库系统中的系统目录表。
- pg_class:存储数据库中的所有关系(例如表、视图、索引等)的元数据信息,包括关系的名称、拥有者、大小、存储位置、索引等信息。
- pg_attribute:存储关系中的所有属性(例如列)的元数据信息,包括属性的名称、数据类型、长度、约束信息等。
- pg_description:存储关系、属性和其他对象的描述信息,例如表和列的注释等。
这些系统目录表在 PostgreSQL 中具有重要作用,允许用户查询数据库元数据信息,从而更好地理解和管理数据库中的关系和属性。
相关问题
SELECT a.attname as 字段名, format_type(a.atttypid,a.atttypmod) as 类型, a.attnotnull as 非空, col_description(a.attrelid,a.attnum) as 注释 FROM pg_class as c,pg_attribute as a where a.attrelid = c.oid and a.attnum>0 and c.relname = 'edi2_expvsl';
这是一个查询语句,用于查询名为"edi2_expvsl"的表中的所有字段的信息,包括字段名、数据类型、是否非空和注释。其中,pg_class和pg_attribute是PostgreSQL中的系统表,用于存储关于数据库、表、列等信息的元数据。具体来说,pg_class表存储了数据库中所有表的信息,而pg_attribute表存储了表中所有列的信息。通过联合这两张表,我们可以获取到表中所有列的详细信息。
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查出的表结构与真实表结构不一致,对比真实表结构字段翻倍这是为什么
这种情况可能是由于表中存在了多个相同的字段导致的。在 PostgreSQL 中,允许在一个表中定义多个同名的字段,只要它们的数据类型、约束条件等属性都相同。而这段 SQL 查询语句是基于系统表 pg_attribute 来获取表结构信息的,它会将每个同名的字段都列出来,因此导致了结果集中每个字段都重复出现了多次。如果想要查看真实的表结构,可以使用 \d+ 命令或者在 pgAdmin 等图形化界面中查看。
阅读全文