我有一个包含 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/