如何读取数据库所有表的相同列,查询全库各表修改记录
最优实现方案
核心逻辑是利用数据库的系统元数据表批量生成包含所有表的UNION ALL查询语句,不需要手动逐个拼接表,几秒就能生成完整查询,可直接执行或用来创建视图。
各数据库具体实现示例
1. MySQL
运行下面的语句生成最终查询SQL:
-- 先临时调大group_concat长度限制,避免表太多导致查询截断 SET SESSION group_concat_max_len = 1000000; SELECT GROUP_CONCAT( 'SELECT \'', TABLE_NAME, '\' AS `Table`, id, timestamp_modify FROM ', TABLE_NAME SEPARATOR ' UNION ALL ' ) AS final_query FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '替换为你的数据库名';
把上面输出的final_query内容复制出来直接执行,就能得到你要的汇总结果。如果需要固定使用,可以把这段查询结果直接作为定义语句创建视图。
2. PostgreSQL
生成查询语句的SQL如下:
SELECT string_agg( format('SELECT %L AS "Table", id, timestamp_modify FROM %I', table_name, table_name), ' UNION ALL ' ) AS final_query FROM information_schema.tables WHERE table_schema = '替换为你的schema名' AND table_catalog = '替换为你的数据库名';
执行后复制输出的final_query内容运行即可。
3. SQL Server
生成查询语句的SQL如下:
DECLARE @final_query NVARCHAR(MAX) = '' SELECT @final_query += 'SELECT ''' + TABLE_NAME + ''' AS [Table], id, timestamp_modify FROM ' + QUOTENAME(TABLE_NAME) + ' UNION ALL ' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG = '替换为你的数据库名' AND TABLE_SCHEMA = '替换为你的schema名' -- 去掉最后多余的UNION ALL字符 SET @final_query = LEFT(@final_query, LEN(@final_query) - 10) -- 直接执行查询 EXEC sp_executesql @final_query
可选优化建议
- 如果不需要每次查询都扫全量历史数据,可以在生成查询的逻辑里给每个子查询加时间过滤条件,比如
WHERE timestamp_modify >= '你要查询的起始时间',大幅减少查询数据量 - 如果这个汇总查询是高频使用的,可以考虑做定时任务,把汇总结果同步到一张单独的汇总表中,查询直接查汇总表即可,性能提升非常明显
内容的提问来源于stack exchange,提问作者PassionateDeveloper
相关产品推荐
相关产品推荐

