mysql - 如何将多个mysql表合并为一个?

标签 mysql sql merge

我有一个包含 121 个表的 Mysql 数据库,具有不同的结构,我需要将所有这些表合并到一个表中。

所有表中有 3 个字段相同(email、base_name、location),但某些表中的所有其他字段都相同,而另一些则不同。

有没有什么墙可以合并表并保留所有字段(有空字段无所谓)?

最佳答案

首先,您需要手动创建一个表,该表包含所有表中的所有唯一列 在电子邮件、base_name、位置上放置一个主键。

这种方法的主要问题是,与包含不同数据的相同列的主键匹配的行将被最近的更新覆盖。

您可以为每个表生成一个插入语句,以下查询将为您提供列列表 通过将 table1 与新表和要更新的列(如果不为空)进行比较,供您选择。

(更改下面的表编号以生成每个表的数据)

SELECT GROUP_CONCAT(NVL(b.COLUMN_NAME,CONCAT('NULL AS ',a.column_name))) as sel_cols
  FROM INFORMATION_SCHEMA.COLUMNS a
  LEFT JOIN INFORMATION_SCHEMA.COLUMNS b ON a.column_name = b.column_name and b.table_name='table1' and b.table_schema = b.table_schema
  WHERE a.table_name = 'new_table' AND b.table_schema = database()

获取要更新的列列表

SELECT GROUP_CONCAT(CASE WHEN b.column_name IS NOT NULL THEN CONCAT(b.column_name,'=VALUES(',b.column_name,')') ELSE END) as upd_cols
  FROM INFORMATION_SCHEMA.COLUMNS a
  LEFT JOIN INFORMATION_SCHEMA.COLUMNS b ON a.column_name = b.column_name and b.table_name='table1' and b.table_schema = b.table_schema
  WHERE a.table_name = 'new_table' AND b.table_schema = database()

例如:

col1, col2, NULL as col3

col1 = VALUES(col1), col2 = VALUES(col2)

现在将列列表和表名粘贴到插入...

INSERT INTO new_table (select col1,col2,NULL as col3 FROM table1)
ON DUPLICATE KEY UPDATE col1 = VALUES(col1), col2 = VALUES(col2)

更改 sql 以生成您需要的所有表的确切语句应该很容易。

也许放一个列来显示发生了覆盖的事实以及原始列的来源, 所以你可以手动解决冲突

关于mysql - 如何将多个mysql表合并为一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7442905/

相关文章:

MYSQL根据不同条件对列进行分组查询

php - 使用 SQL 查询填充 D3.js 饼图

git - 在 Bitbucket Repo 中恢复 merge 的分支

python pandas 聚合后重新附加列

php - 如何告诉用户数据库中没有用户输入的特定日期的数据

mysql - 设置一列以从另一个表复制一列(根据条件)

python - 如何将 python 字典 pickle 到 MySQL 中?

mysql - 如何从表中删除除一条记录之外的所有重复记录?

php - 从数据库中选择(从今天)差异最小的日期

git - 通过 pull 请求撤消 merge ?