You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并MySQL中所有表?附城市经济数据数据库架构咨询

嘿,我来帮你搞定这个数据库设计的问题!你的核心痛点是单城市单表的设计导致跨表批量查询完全没法玩,下面给你两个解决方案——一个是一劳永逸的架构优化,另一个是临时救急的表合并方法,你可以根据自己的情况选:

最优解:重构数据库表结构

你现在每个城市建一张表的思路属于反范式设计,虽然单个城市的时序查询方便,但一旦涉及跨城市的批量查询就彻底卡壳,而且后续新增城市、新增统计字段都会特别麻烦。正确的做法是用一张统一的表来存所有城市的时序数据:

建议的表结构

创建一张city_statistics表(名字可以自己改),字段设计如下:

CREATE TABLE city_statistics (
    city_name VARCHAR(50) NOT NULL, -- 如果城市有更多属性(比如省份),可以额外建一张cities字典表用city_id关联,更规范
    year INT NOT NULL,
    GDP DECIMAL(15,2) NULL,
    pop INT NULL,
    cpi DECIMAL(5,2) NULL,
    PRIMARY KEY (city_name, year) -- 联合主键,保证每个城市每年只有一条数据
);

两个需求的SQL实现

需求1:查询所有城市2017年的GDP、人口、CPI

SELECT city_name, GDP, pop, cpi 
FROM city_statistics 
WHERE year = 2017;

需求2:查询city_1在2000-2017全时段的所有数据

SELECT * 
FROM city_statistics 
WHERE city_name = 'city_1' 
AND year BETWEEN 2000 AND 2017;

以后不管新增城市还是新增统计指标,直接在这张表里插数据或者加字段就行,彻底解决你现在的痛点。

临时救急:自动合并现有所有城市表

如果暂时没法重构表结构,你可以用动态SQL自动生成合并语句,不用手动逐个写。以MySQL为例,步骤如下:

1. 生成合并所有表的SQL语句

执行下面的查询,会自动拼接出所有城市表的UNION ALL语句:

SELECT CONCAT(
    'SELECT * FROM ', 
    GROUP_CONCAT(table_name SEPARATOR ' UNION ALL SELECT * FROM ')
) AS merge_sql
FROM information_schema.tables 
WHERE table_schema = '你的数据库名称' -- 替换成你实际的数据库名
AND table_name LIKE 'city_%'; -- 假设你的城市表都是city_开头,比如city_1、city_2,根据实际情况调整匹配规则

执行后会得到类似这样的结果:

SELECT * FROM city_1 UNION ALL SELECT * FROM city_2 UNION ALL SELECT * FROM city_3 ...

2. 创建合并后的新表

把上面生成的SQL语句套进CREATE TABLE ... AS里,就能得到合并后的统一表:

CREATE TABLE merged_city_data AS
SELECT * FROM city_1 UNION ALL SELECT * FROM city_2 ...; -- 替换成上面生成的内容

⚠️ 注意:所有城市表的字段数量、类型必须完全一致,否则UNION ALL会报错。

3. 需求1的查询SQL

合并完成后,查询所有城市2017年的数据就简单了:

SELECT * FROM merged_city_data WHERE year = 2017;
总结

强烈推荐你用重构表结构的方案,这是长期来看最合理、最易维护的选择。临时合并表只是权宜之计,后续新增城市还是要重复操作,而统一表结构可以一劳永逸解决所有问题。

内容的提问来源于stack exchange,提问作者user9821719

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:18:13