如何高效查找数据库My_DB中包含列My_Emp_ID的所有表
如何高效查找数据库My_DB中包含列My_Emp_ID的所有表
手动挨个翻几百张表找指定列?这也太折磨人了!我来给你分享几个主流数据库里高效搞定的方法,不用再浪费时间手动排查:
MySQL/MariaDB
直接利用系统自带的information_schema元数据库,它存储了所有数据库、表和列的结构信息。运行下面的SQL就能一键得到结果:
SELECT table_name FROM information_schema.columns WHERE table_schema = 'My_DB' AND column_name = 'My_Emp_ID';
这个查询会直接过滤出My_DB库中所有包含My_Emp_ID列的表名,速度快还准确。
SQL Server
你可以选择两种方式,第一种是通过系统视图关联查询:
SELECT t.name AS table_name FROM sys.columns c JOIN sys.tables t ON c.object_id = t.object_id JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE s.name = 'dbo' -- 替换成你的统一schema名称 AND c.name = 'My_Emp_ID' AND t.type = 'U'; -- 仅查询用户创建的表,排除系统表
第二种也可以用information_schema,写法更简洁:
SELECT table_name FROM information_schema.columns WHERE table_catalog = 'My_DB' AND table_schema = 'dbo' -- 替换成你的统一schema名称 AND column_name = 'My_Emp_ID';
PostgreSQL
同样可以借助information_schema快速查询:
SELECT table_name FROM information_schema.columns WHERE table_catalog = 'My_DB' AND table_schema = 'public' -- 替换成你的统一schema名称 AND column_name = 'My_Emp_ID';
如果习惯用PostgreSQL原生的系统目录表,也可以用这个查询:
SELECT relname AS table_name FROM pg_catalog.pg_attribute a JOIN pg_catalog.pg_class c ON a.attrelid = c.oid JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid WHERE n.nspname = 'public' -- 替换成你的统一schema名称 AND a.attname = 'My_Emp_ID' AND a.attnum > 0 -- 排除系统隐藏列 AND NOT a.attisdropped -- 排除已被删除的列 AND c.relkind = 'r'; -- 仅查询普通用户表
总的来说,核心思路就是利用数据库自带的元数据存储(系统视图/表),不用手动遍历,运行一条SQL就能快速得到所有符合条件的表,效率拉满!
备注:内容来源于stack exchange,提问作者Talha Tayyab




