如何在PostgreSQL服务器全库中按列名查找特定表?PGAdmin/psql实现
在PostgreSQL中按列名跨库查找对应表
1. 单个数据库内查找指定列所属表
直接查询PostgreSQL标准的信息模式视图information_schema.columns,就能快速定位列所在的表:
SELECT table_catalog AS 数据库名, table_schema AS 模式名, table_name AS 表名 FROM information_schema.columns WHERE column_name = '目标列名' -- 替换为你要查找的列名 ORDER BY 数据库名, 模式名, 表名;
如果需要忽略大小写匹配(比如不确定列名大小写),可以用ILIKE替代=:
WHERE column_name ILIKE '目标列名'
2. 遍历所有数据库批量查找
PostgreSQL没有原生跨库查询语法,需要借助psql终端的元命令或脚本实现批量遍历:
方法一:用psql的\gexec元命令自动执行
- 登录psql终端(可连接任意数据库,比如默认的
postgres库) - 执行以下语句,自动生成并执行所有非模板数据库的查询:
SELECT format( 'SELECT ''%I'' AS 数据库名, table_schema AS 模式名, table_name AS 表名 FROM %I.information_schema.columns WHERE column_name = ''目标列名'';', datname, datname ) FROM pg_database WHERE datistemplate = false; -- 过滤系统模板数据库 \gexec
- 替换语句中的
'目标列名'为实际要查找的列名 datistemplate = false会排除template0、template1这类系统模板库,只查询用户创建的数据库
方法二:Shell脚本批量处理(适用于Linux/macOS)
如果需要自动化执行,可编写如下Shell脚本:
#!/bin/bash TARGET_COLUMN="目标列名" PG_USER="你的PostgreSQL用户名" # 获取所有非模板数据库列表 DBS=$(psql -U $PG_USER -d postgres -t -c "SELECT datname FROM pg_database WHERE datistemplate = false;") for DB in $DBS; do echo "=== 数据库: $DB ===" psql -U $PG_USER -d $DB -c "SELECT table_schema AS 模式名, table_name AS 表名 FROM information_schema.columns WHERE column_name = '$TARGET_COLUMN' ORDER BY 模式名, 表名;" done
- 替换
TARGET_COLUMN和PG_USER为实际值 - 给脚本添加执行权限:
chmod +x find_tables.sh,然后运行./find_tables.sh
注意事项
- 如果列名是创建时加了双引号的大小写敏感名称,查询时要把列名用转义双引号包裹,比如
WHERE column_name = "\"MySpecialColumn\"" - 确保执行查询的用户拥有所有目标数据库的
information_schema视图访问权限
内容的提问来源于stack exchange,提问作者Julio Marins
相关产品推荐
相关产品推荐

