首先,您需要手动创建在所有表中包含所有唯一列的表
将主键放在电子邮件、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 以生成您需要的确切语句,并且适用于所有表。
也许可以放置一个列来显示发生覆盖以及原始列来自何处的事实,
所以你可以手动解决冲突