PostgreSQL元数据探索:从INFORMATION_SCHEMA.columns获取表结构全貌

information_schema信息数据库介绍 INFORMATION_SCHEMA 是一种特殊的数据库,它在 SQL 标准中定义并存在于许多类型的数据库中,用于存储数据库的元数据,包括数据库、表、列、约束、权限等的信息。 尽管 INFORMATION_SCHEMA 对于数据库元数据的访问非常有用,但是在大型数据库中频繁访问 INFORMATION_SCHEMA 可能会影响性能,因为生成这些信息可能需要消耗大量资源。 阅读详情

1. 初识INFORMATION_SCHEMA.columns:你的数据库结构探测器

第一次接触PostgreSQL的元数据查询时,我就像拿到了一把万能钥匙。记得当时接手一个遗留系统,文档早已过时,几十张表的结构全靠猜。直到发现 INFORMATION_SCHEMA.columns 这个宝藏视图,问题才迎刃而解。

这个视图就像是数据库的X光机,能透视表结构的每一个细节。与简单的 \d 命令不同,它提供了标准化的SQL接口,返回的结果集可以直接用程序处理。我后来写的自动化文档工具就是基于这个视图,每周自动生成最新的数据字典发给团队。

关键字段解析 :

  • column_name :列名,这个不用多说
  • data_type :数据类型,但要注意这里返回的是标准SQL类型,不是PostgreSQL特有的
  • character_maximum_length :对字符串类型特别有用,能知道varchar(50)里的那个50
  • numeric_precision 和 numeric_scale :数字类型的精度和小数位数
  • is_nullable :是否允许NULL值
  • column_default :默认值表达式
-- 基础查询示例
SELECT column_name, data_type, is_nullable 
FROM information_schema.columns 
WHERE table_name = 'employees';

2. 为什么选择INFORMATION_SCHEMA而非系统目录

刚开始我也疑惑,PostgreSQL明明有自己的 pg_catalog ,为什么还要用这个?直到有次需要把脚本移植到MySQL才发现它的价值。 INFORMATION_SCHEMA 是SQL标准的一部分,跨数据库兼容性极佳。

有次客户突然要求支持SQL Server,我差点崩溃。结果发现只需微调几个语法,核心的元数据查询几乎不用改。这种可移植性在混合环境中特别珍贵。

与pg_catalog的对比 :

  • 标准vs私有: information_schema 遵循SQL标准, pg_catalog 是PostgreSQL特有的
  • 稳定性:标准视图的结构更稳定,而系统目录可能随版本变化
  • 安全性: information_schema 通常对普通用户更友好

不过要注意,某些PostgreSQL特有功能(如表继承)在这里查不到,这时还是得用 pg_catalog 。

3. 实战:从简单查询到高级应用

3.1 基础表结构探查

最基本的用法就是查看表有哪些列。比如要快速了解一个陌生的orders表:

SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_schema = 'public'
  AND table_name = 'orders'
ORDER BY ordinal_position;

这个查询能给出列名、类型、是否可为空和默认值,已经比 \d 命令更结构化。

3.2 生成数据字典

我做项目时常用这个生成Markdown格式的文档:

SELECT 
    c.column_name as "列名",
    c.data_type as "类型",
    CASE WHEN c.character_maximum_length IS NOT NULL 
         THEN c.data_type || '(' || c.character_maximum_length || ')' 
         ELSE c.data_type END as "完整类型",
    c.is_nullable as "允许空",
    c.column_default as "默认值",
    pgd.description as "注释"
FROM 
    information_schema.columns c
LEFT JOIN 
    pg_catalog.pg_statio_all_tables st
    ON c.table_schema = st.schemaname AND c.table_name = st.relname
LEFT JOIN
    pg_catalog.pg_description pgd
    ON pgd.objoid = st.relid AND pgd.objsubid = c.ordinal_position
WHERE 
    c.table_name = 'products'
ORDER BY 
    c.ordinal_position;

这个查询还关联了pg_description获取列注释,输出可以直接粘贴到文档里。

3.3 数据类型分析

排查性能问题时,我常需要统计哪些表用了特定类型:

-- 查找所有使用jsonb类型的列
SELECT table_name, column_name
FROM information_schema.columns
WHERE data_type = 'jsonb'
  AND table_schema NOT IN ('pg_catalog', 'information_schema');

3.4 跨表关联分析

有次需要找出所有引用user_id的外键,我是这样查的:

SELECT
    kcu.table_name as "来源表",
    kcu.column_name as "外键列",
    ccu.table_name as "目标表",
    ccu.column_name as "目标列"
FROM
    information_schema.key_column_usage kcu
JOIN information_schema.constraint_column_usage ccu
    ON ccu.constraint_name = kcu.constraint_name
WHERE
    ccu.table_name = 'users'
    AND ccu.column_name = 'id';

4. 高级技巧与避坑指南

4.1 处理大对象类型

PostgreSQL的BLOB类型(bytea)在 information_schema 中显示为"bytea",但要注意 character_maximum_length 对这些类型是NULL。如果需要知道具体大小限制,得查 pg_catalog.pg_attribute 。

4.2 生成列的特殊处理

PostgreSQL 12+支持生成列(GENERATED ALWAYS AS),这些列在 information_schema.columns 中会有 is_generated 字段标识。但默认值表达式可能比较难解析,我通常结合 pg_attribute 和 pg_get_expr 函数获取更详细的信息。

4.3 性能优化

在大型数据库(几千张表)中查询 information_schema 可能会慢。我常用的优化方法是:

  1. 加上 table_schema 条件缩小范围
  2. 对结果做缓存,特别是文档生成场景
  3. 复杂查询拆分成多个简单查询
-- 优化后的查询示例
EXPLAIN ANALYZE 
SELECT column_name, data_type 
FROM information_schema.columns 
WHERE table_schema = 'sales' 
  AND table_name = 'transactions';

4.4 权限问题

普通用户可能看不到某些系统表的元数据。如果遇到空结果,检查是否有足够的权限。我常用的方法是给用户授予:

GRANT USAGE ON SCHEMA information_schema TO readonly_user;

5. 与其他工具的集成

5.1 与psql配合使用

虽然本文重点在SQL查询,但psql的 \d 命令确实方便。其实两者可以互补使用:先用 \d 快速浏览,再用 information_schema 深入分析。

5.2 在Python中的应用

我常用的psycopg2配合pandas可以这样用:

import pandas as pd
import psycopg2

conn = psycopg2.connect("dbname=mydb user=postgres")
df = pd.read_sql("""
    SELECT table_name, column_name, data_type 
    FROM information_schema.columns 
    WHERE table_schema = 'public'
""", conn)

5.3 与BI工具集成

Tableau等工具可以直接用这些视图做数据字典。我建过一个Dashboard,实时显示数据库结构变化,特别适合敏捷开发环境。

6. 真实案例:自动化迁移检查

去年参与一个迁移项目,需要确保新旧数据库结构一致。我写了这样的检查脚本:

-- 比较两个库的表结构差异
WITH source_columns AS (
    SELECT * FROM dblink('source_db', '
        SELECT table_name, column_name, data_type, is_nullable 
        FROM information_schema.columns 
        WHERE table_schema = ''public''
    ') AS t(table_name text, column_name text, data_type text, is_nullable text)
),
target_columns AS (
    SELECT * FROM information_schema.columns 
    WHERE table_schema = 'public'
)
SELECT 
    'missing_in_target' as diff_type,
    s.table_name,
    s.column_name
FROM 
    source_columns s
LEFT JOIN 
    target_columns t ON s.table_name = t.table_name AND s.column_name = t.column_name
WHERE 
    t.table_name IS NULL
UNION ALL
SELECT 
    'missing_in_source' as diff_type,
    t.table_name,
    t.column_name
FROM 
    target_columns t
LEFT JOIN 
    source_columns s ON s.table_name = t.table_name AND s.column_name = t.column_name
WHERE 
    s.table_name IS NULL;

这个脚本帮我们发现了十几个不一致的地方,节省了大量手动比对时间。

7. 扩展应用:动态SQL生成

information_schema 最强大的地方是可以用SQL生成SQL。比如批量给所有字符串列加注释:

SELECT 'COMMENT ON COLUMN ' || table_name || '.' || column_name || 
       ' IS ''String column with max length ' || character_maximum_length || ''';'
FROM information_schema.columns
WHERE data_type LIKE '%character%'
  AND table_schema = 'public';

执行结果会是一组SQL语句,可以直接复制执行。这种技巧在管理大型数据库时特别有用。

8. 性能监控与优化

通过定期采集 information_schema 数据,可以监控数据库结构变化。我建过这样一个历史记录表:

CREATE TABLE schema_history AS
SELECT now() as snapshot_time, *
FROM information_schema.columns
WHERE false;  -- 只创建结构

-- 定期执行
INSERT INTO schema_history
SELECT now(), * 
FROM information_schema.columns;

这样就能追踪哪些表增加了列,哪些列改了类型,对排查问题特别有帮助。

PostgreSQL 18 INFORMATION_SCHEMA.columns 详解:从 35 个字段到 3 个实战查询 本文深入解析PostgreSQL 18中INFORMATION_SCHEMA.columns视图的35个字段,提供从基础标识到高级类型特性的全面解读。通过三个实战查询示例,展示如何批量生成DDL语句、对比表结构差异以及生成数据字典,帮助开发者高效管理数据库元数据。 阅读详情

相关推荐

PostgreSQL 18 表结构查询:\d 与 INFORMATION_SCHEMA 的 3 种高级应用场景

本文深入探讨PostgreSQL 18中表结构查询的高级应用,重点解析`\d`命令与`INFORMATION_SCHEMA`的三种实用场景:自动化脚本元数据提取、系统表信息差异分析以及数据库关系图构建。通过具体SQL示例展示如何高效获取表结构、约束和索引信息,助力开发者优化数据库管理与维护流程。

weixin_34129696的博客 335

PostgreSQL 18 INFORMATION_SCHEMA.columns 实战:10个高级查询获取完整表元数据

本文深入探讨了PostgreSQL 18中INFORMATION_SCHEMA.columns视图的10个高级查询技巧,帮助开发者全面获取表结构元数据。从字符集分析到生成列定义,再到列级权限审计,这些生产级查询技术能显著提升数据库管理和元数据分析效率。特别适合需要深度掌握PostgreSQL表结构的开发者和DBA。

weixin_30919571的博客 313

深入解析PostgreSQL系统Schema:pg_catalog与information_schema的实战对比

本文深入对比PostgreSQL中pg_catalog与information_schema两大系统Schema的实战应用。通过具体案例解析两者的核心差异:pg_catalog提供原生底层数据访问,适合深度调优;information_schema遵循SQL标准,确保跨数据库兼容性。文章包含性能对比、选型建议及高级技巧,帮助开发者高效管理数据库元数据。

weixin_29238147的博客 375

JS 数组或数组对象去重的9种方法

/ 数组去重// 数组对象去重{ id: 1, name: "数据1" },{ id: 1, name: "数据2" },{ id: 2, name: "数据3" },{ id: 3, name: "数据4" },{ id: 4, name: "数据5" },{ id: 3, name: "数据6" },{ id: 5, name: "数据7" }

UserGuan的博客 1万+

PostgreSQL 16 元数据查询实战:1条SQL获取表结构、索引、注释与主键

本文详细介绍了PostgreSQL 16中通过单条SQL查询获取表结构、索引、注释与主键等元数据的实战方法。通过解析核心系统表和多表连接技术,提供高效的复合查询方案,适用于数据库文档生成、数据血缘分析等场景,显著提升数据治理效率。

weixin_34226706的博客 357

神通数据库(openGauss版)与PostgreSQL:3处关键元数据查询差异对比

本文详细对比了神通数据库(openGauss版)与PostgreSQL在元数据查询方面的3处关键差异,包括数据库实例信息、模式空间和表结构查询。通过具体代码示例和性能优化建议,帮助迁移工程师快速适应神通数据库的系统目录结构和查询方式,提升工作效率。

weixin_33676492的博客 351

JavaScript数组去重的12种方法

1、利用 ES6 Set 去重(ES6 中最常用) Set 对象是 ES6 中新定义的数据结构,类似于数组,它允许你存储任何类型的唯一值,不管是原始值还是对象引用。 Array.from() 方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组。 var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a

icemwj的博客 6884

手工SQL注入与脱库实战:从information_schema到数据窃取全流程解析

SQL注入作为Web安全领域的经典漏洞,其核心原理在于应用程序未能正确区分用户输入的“数据”与可执行的“代码”边界,导致攻击者能够通过构造恶意输入来操纵后端数据库查询逻辑。从技术实现层面看,这通常源于开发者直接拼接用户输入到SQL语句中,而未采用参数化查询等安全编码实践。理解SQL注入不仅有助于识别和修复安全漏洞,更是掌握数据库安全、应用层防护机制的基础。在渗透测试和CTF竞赛中,手工利用`information_schema`系统数据库进行脱库是检验SQL注入危害性的关键场景,它要求测试者熟练掌握UNIO

weixin_30873847的博客 409

PostgreSQL 表结构查询对比:\d 命令 vs INFORMATION_SCHEMA 的 5 个关键差异

本文详细比较了PostgreSQL中查询表结构的两种方法:`\d`命令和`INFORMATION_SCHEMA`视图,分析了它们在信息完整性、可编程性、跨平台兼容性、性能及权限控制等5个关键差异。通过实际案例和代码示例,帮助开发者根据场景选择最适合的表结构查询方式,提升数据库管理效率。

weixin_33804582的博客 304

局部路径规划算法 - B样条曲线(B-spline Curves)

本文详解了B样条以及代码实现

BigDavid123的博客 6508

手把手教你搭建基于Springboot+Vue的酒店管理系统

友友们,又是好久没更新了,马上元旦了,要迈入2025蛇年了,提前祝大家蛇年快乐,学有所成,本文博主将带领大家使用Springboot和Vue搭建一个酒店管理系统,受限于本文篇幅内容,本文罗列仅有部分简单示例内容,主要包括前后端示例源码。通过本文,你将大致掌握如何快速搭建一个现代化的Web应用。如果您想学习完整开发方案,包括项目源码+数据库文件+全套环境资源+代码部署视频教程+开发文档】获取学习资源,支持远程安装调试:一、项目背景随着互联网技术的不断发展,酒店行业对信息化的需求越来越高。

暴力码农的博客 1324

PostgreSQL 系统目录 vs INFORMATION_SCHEMA:查询表结构的 5 个关键区别

本文深入解析了PostgreSQL中系统目录(pg_catalog)与INFORMATION_SCHEMA在查询表结构时的5个关键区别,包括架构设计、信息完整性、查询性能、可移植性和实际应用场景。通过对比分析,帮助开发者根据需求选择最适合的元数据查询方法,提升数据库开发和维护效率。

weixin_34347651的博客 636

Zephyr RTOS详解

Zephyr 是一个开源的实时操作系统(RTOS),专为资源受限的嵌入式设备设计,支持多种架构(如 ARM Cortex-M、RISC-V、x86 等)。

weixin_43484713的博客 4109

理解 PostgreSQL Information_Schema 视图

Information_schema是一个系统目录,它形成一组标准视图,其中包含有关PostgreSQL数据库对象的信息,本质上,它是一个元数据库,保存有关您当前数据库的信息。它存在于所有符合标准的SQL数据库引擎中,这使得它在迁移时非常有用。必须注意的是,information_schema是只读的,不支持插入新信息或更改现有数据。让我们开始探索 information_schema 中的不同观点,这些视图可以对用户进行各种实践。代码与所有 PostgreSQL 版本兼容。

allway2的博客 814

基于YOLOv8的多类别检测模型融合实战:从数据集重构到模型训练

本文详细介绍了如何将多个单一类别的YOLOv8检测模型融合为一个高效的多类别检测模型。通过重构数据集、利用预训练模型生成新标签,并重新训练,解决了多模型并行带来的速度慢、资源占用高和部署复杂等问题。实战流程涵盖数据准备、标签生成、模型训练与评估,旨在帮助开发者构建性能优异的YOLOv8多类别检测模型。

kmeans3miner的博客 228

【社招算法经验贴】算法社招记录

总的来说,也是收获了七七八八的offer,给的涨幅40~100%,职级有的可以对标到 p7(但阿里p7是真难a,a不动)。面了一圈下来,感觉大模型也在收缩hc。尤其是多模态相关hc。凭着上学期间做过相关视觉的work和paper,社招虽然能进面试,但是hc少得可怜,多模态已死慎入。还有大模型应用算法给的涨幅,跟搜广推的涨幅差别不大。真正能几百万往上的是基座pretrain/后训练/infra,但是全靠social和conn,hc极少。

Danger的博客 981

mysql,postgresql,oracle,hive元数据库等查看表结构信息

我们在查询表结构的时候,从information_schema里面获取,单独语句只能查询部分信息,比如:information_schema.tables 和information_schema.columns 。前者只能获取表相关数据,无法显示字段详信息,后者只能获取字段详细信息,无法获取表以及库的信息。 现在将两者结合在一起,获取需要的全部信息 本脚本目前只针对mysql和pg库,其他数据库后续会有补充。 本脚本可以快速查询你想要的整个数据库的表结构,如图: mysql: 注意:脚本需

小小争520 3899

MTK(camera篇)Camera整体点亮

本文介绍了在MTK平台上添加新Camera Sensor的驱动开发流程。主要内容包括:1)MTK Camera采用HAL3架构,驱动层主要负责sensor电源控制和寄存器操作;2)详细说明了添加新sensor需要在多个文件中进行的修改,包括设备树配置、内核头文件、驱动列表、电源序列等;3)特别指出需要配置I2C地址表,并导入tuning文件和metadata文件以完善ISP处理流程。文章提供了完整的文件修改清单,涵盖了从内核层到HAL层的完整开发过程,为MTK平台Camera Sensor驱动开发提供了具体

weixin_49303682的博客 361

PostgreSQL中查看表结构的方法

本文介绍查看 PostgreSQL 中表的结构的两种方法。

SQLplusDB的小院 2万+

YOLO + Qwen3-VL-Seg 深度诊断:双引擎协同完成AI质检

本文提出了一种创新的工业质检双引擎架构,结合YOLO实时检测与Qwen3-VL-Seg精细化诊断,有效解决了传统检测方法中检测与诊断割裂的问题。YOLO部署在边缘端实现高效定位(3.2MB模型,<10ms延迟),Qwen3-VL-Seg在云端完成语义级缺陷分析(仅17M参数的解码器实现像素级分割)。该方案通过6步闭环流程,从实时感知到工艺反哺,显著提升了工业质检的准确性和可解释性,为智能制造提供了从"发现"到"解决"的完整技术路径。

mingo_敏 221

华为OD机试 新系统真题 【数字系统转换器】

华为OD机试 新系统真题【数字系统转换器】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【数字系统转换器】多语言题解。

qq_45776114的博客 542

MySQL数据库结构探查全攻略:从DESCRIBE到INFORMATION_SCHEMA深度解析

数据库元数据是描述数据库结构的基础信息,包括表、列、索引等对象的定义。在关系型数据库中,通过系统表或信息模式可以查询这些元数据,这是数据库管理和开发的核心技能。MySQL提供了DESCRIBE、SHOW命令和INFORMATION_SCHEMA等多种探查方式,其中INFORMATION_SCHEMA作为标准化的信息数据库,能提供最全面灵活的元数据访问。掌握这些技术对于数据库维护、性能优化和自动化运维至关重要,特别是在需要快速理解陌生数据库结构或进行数据字典生成的场景。本文聚焦MySQL的元数据探查实践,详细

weixin_34279579的博客 396

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

PostgreSQL 表结构查询:\d 命令与 SQL 查询的 5 个性能与场景对比

本文深入对比了PostgreSQL中查看表结构的两种方法:`\d`命令和`INFORMATION_SCHEMA` SQL查询。从性能、信息完整性、自动化集成能力、权限要求等5个维度进行分析,帮助开发者根据实际场景选择最佳方案。测试显示`\d`命令性能更优,而`INFORMATION_SCHEMA`更适合跨平台应用开发。

chongkuachan8070的博客 346

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数据库表结构自动化导出工具:从元数据查询到多格式文档生成

数据库元数据是描述数据结构和属性的核心信息,包括表名、字段、类型、约束等。通过查询数据库的系统表或信息模式(Information Schema),可以程序化地获取这些元数据。自动化处理元数据能极大提升开发效率,确保文档的准确性和一致性,其技术价值在于将人工从繁琐的文档编写工作中解放出来,实现知识管理的标准化。这一技术广泛应用于项目交接、团队协作、系统设计评审和运维部署等场景。本文聚焦于利用Python生态的SQLAlchemy、Jinja2和python-docx等库,构建一个支持导出Word、HTML等

weixin_28716181的博客 330

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SQL Server 2019元数据查询实战:从sys视图到数据库字典生成

数据库元数据是描述数据库、表、列等对象结构的信息,是数据管理和治理的基础。其核心原理是通过系统目录视图或信息架构视图来访问数据库引擎内部存储的结构化信息。掌握元数据查询技术对于数据库文档化、数据迁移、资产盘点及自动化运维具有重要价值,广泛应用于数据字典生成、ETL流程设计、权限审计等场景。本文聚焦SQL Server 2019环境,针对常见的“无效对象名”报错问题,深入解析如何通过sys.columns、sys.key_constraints等系统视图,替代Oracle中的USER_TAB_COLUMNS等

weixin_34269583的博客 309

DBeaver 数据字典文档生成:从表结构到自动化流水线

如果表结构已经变了,你手工维护的文档永远追不上。DBeaver 本身就带着数据转移导出、ERD 图、DDL 生成这三件套,足够你拼出一条数据字典文档自动生成流水线:把库里的元信息查出来,导出成 Markdown,再挂上定时任务,文档每天自己更新。 [![DBeaver 社区版启动画面,用于数据字典与文档自动生成的通用数据库管理工具](https://raw.gitcode.com/GitHub_

gitblog_00897的博客 971
上一篇: 锂离子电池过压保护与BQ29200硬件设计详解
下一篇: C++ Qt实战:从零构建学生成绩管理系统,详解CRUD与SQLite应用
de1981
博客等级 码龄12年 8粉丝 208原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值