postpresql 查询某张表的字段名和字段类型

2023-11-27 09:45

本文主要是介绍postpresql 查询某张表的字段名和字段类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

postpresql 查询某张表的字段名和字段类型

工作中第一次接触postpresql,接触到这么个需求,只是对sql有点了解,于是就网上查阅资料。得知通过系统表可以查询,设计到几张系统表:pg_class、pg_attrubute、information_schema.columns 。

其中pg_class 这张表记录了所有表或者像表的东西。包括表、索引、视图、物化视图、组合类型和TOAST表。其中一些字段的含义如下表所示。

​ pg_class

字段名字段描述
oid表的唯一标识符(Object ID)
relname表的名称
relnamespace表所属的命名空间(pg_namespace 表的 oid)
reltype表的类型。对于表,这通常是 pg_type 表中的 oid
reloftype对于复合类型的表,它表示相关联的基础类型
relowner表的所有者(用户的 oid)
relam索引使用的存储方法的 oid
relfilenode表在磁盘上的文件节点号
reltablespace表所在的表空间的 oid
relpages表占用的页数
reltuples表中的元组数。
reltoastrelid如果存在,指向 pg_class 中的 TOAST 表的 oid
reltoastidxid如果存在,指向 TOAST 表的索引的 oid
relhasindex表是否有索引
relisshared表是否是共享的
relpersistence表的持久性(永久的还是临时的)
relkind表的类型,可能是 ‘r’(表)、‘i’(索引)等
relchecks表约束的数量
reltriggers表触发器的数量
relhasrules表是否有规则
relhasoids表是否有 OIDs(Object Identifiers)

pg_attrubute

这张表包含了有关表的每一列的详细信息,例如数据类型、是否为空等。

字段名字段描述
attrelid:属性所属的表的 OID。
attname:列名。
atttypid列的数据类型的 OID,对应于 pg_type 表中的 oid。
attstattarget用于统计信息的目标值。
attlen列的长度(以字节为单位)。
attnum列的序号。正整数表示用户定义的列,0 表示系统列。
attndims数组的维数,如果不是数组则为 0。
attcacheoff用于计算偏移量的缓存位置。
atttypmod类型修饰符。对于 varchar(n) 这样的类型,它存储 n 的值。
attbyval如果列的传递是按值传递,则为 true;否则为 false。
attstorage列的存储方式(‘p’ 表示普通、‘e’ 表示外部、‘m’ 表示主内存)。
attalign列的对齐方式(‘c’ 表示 CHAR、‘s’ 表示 SHORT、‘i’ 表示 INT、‘d’ 表示 DOUBLE)。
attnotnull如果列不允许为空,则为 true;否则为 false。
atthasdef如果列有默认值,则为 true;否则为 false。
attisdropped如果列已被删除,则为 true;否则为 false。
attislocal如果列是表的本地列,则为 true;否则为 false。
attinhcount列是否继承自父表。
attcollation列的排序规则的 OID。
attacl列的访问控制列表。
attoptions列的选项。
attfdwoptions表示列是否有存储外部化的选项。
attmissingval缺失值。

原本的想法,或者说是拿到的代码。要查的是adb_task_daily_detail_log 这张表的字段类型和数据

-- 取字段名和字段类型
select
a.attname as name,
format_type(a.atttypid,a.atttypmod) as type,
col_description(a.attrelid,a.attnum) as comment,
a.attnotnull as notnull
from
pg_class as c,
pg_attribute as a
where
c.relname='adb_task_daily_detail_log'
and
a.attrelid=c.oid -- 关联条件
and
a.attnum>0;

问题出现了,对于adb_task_daily_detail_log这张表,pg_class出现了2条记录。

查了半天也搞不懂为什么有两条记录,如果有大哥知道的话请指导下小弟。

有说多一条索引,就会多一条记录,但是这张表也没有索引。

有说表记录了TOAST相关的信息也会多存储一条relkind =‘t’ 的记录,但是这两条记录都是’r’。

所以后果就是查询出来的字段数量会重复。

方式2:

查information_schema.columns

information_schema.columns 是 PostgreSQL 中的系统视图之一,它存储了数据库中所有表的列信息。这个视图允许用户查询表的元数据,包括列名、数据类型、是否为主键、是否允许为空等。

字段名称字段描述
table_catalog表所属的数据库名称。
table_schema表所属的模式(Schema)名称。
table_name表的名称。
column_name列的名称。
ordinal_position列在表中的位置,从 1 开始。
column_default列的默认值。
is_nullable如果列允许为 NULL,则为 “YES”;否则为 “NO”。
data_type列的数据类型。
character_maximum_length如果数据类型是字符型,则是字符的最大长度。
character_octet_length字符的八位字节长度。
numeric_precision如果数据类型是数字型,则是精度。
numeric_precision_radix数字的基数(通常为 10)。
numeric_scale如果数据类型是数字型,则是小数点后的位数。
datetime_precision如果数据类型是日期时间型,则是小数秒的位数。
interval_type如果数据类型是间隔型,则是间隔类型。
interval_precision如果数据类型是间隔型,则是间隔的精度。
character_set_catalog字符集所属的数据库名称。
character_set_schema字符集所属的模式名称。
character_set_name字符集的名称。
collation_catalog校对规则所属的数据库名称。
collation_schem校对规则所属的模式名称。
collation_name校对规则的名称。
domain_catalog如果列是域类型的基础类型,则是基础类型所属的数据库名称。
domain_schema如果列是域类型的基础类型,则是基础类型所属的模式名称。
domain_name如果列是域类型的基础类型,则是基础类型的名称。
select column_nameconcat(data_type,case when character_maximum_length is not null then '(' || character_maximum_length || ')'else ''end) as typefrom information_schema.columns
where table_name ='adb_task_daily_detail_log';

为了要使得数据类型和长度一起显示 做了一个拼接,但是只有字符类型的数据才会被拼接。需求是对数字类型的数字也拼接。

format_type 这个函数得到的数据就是满足要求的。

方式3:

select attname as nameformat_type (atttypeid,atttypmod) as typefrompg_attributewhereattrelid ='adb_task_daily_detail_log'::regclass and attnum>0;
  • ::regclass 是 PostgreSQL 的类型转换语法。它将一个标识符(在这里是字符串 'adb_task_daily_detail_log')转换为 regclass 类型。
  • attrelidpg_attribute 表中的一个字段,表示属性(列)所属的表的 OID。

所以,attrelid = 'adb_task_daily_detail_log'::regclass 这个条件是在过滤 pg_attribute 表的记录,只选择属于名为 'adb_task_daily_detail_log' 的表的记录。

这样做是因为在 PostgreSQL 中,每个表都有一个唯一的 OID,而 pg_attribute 表存储了关于表的每个列的信息。通过检查 attrelid,我们可以限制结果只包括特定表的列信息。

这篇关于postpresql 查询某张表的字段名和字段类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/427452

相关文章

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景

Redis KEYS查询大批量数据替代方案

《RedisKEYS查询大批量数据替代方案》在使用Redis时,KEYS命令虽然简单直接,但其全表扫描的特性在处理大规模数据时会导致性能问题,甚至可能阻塞Redis服务,本文将介绍SCAN命令、有序... 目录前言KEYS命令问题背景替代方案1.使用 SCAN 命令2. 使用有序集合(Sorted Set)

C# dynamic类型使用详解

《C#dynamic类型使用详解》C#中的dynamic类型允许在运行时确定对象的类型和成员,跳过编译时类型检查,适用于处理未知类型的对象或与动态语言互操作,dynamic支持动态成员解析、添加和删... 目录简介dynamic 的定义dynamic 的使用动态类型赋值访问成员动态方法调用dynamic 的

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]