在MySQL中将2个不同的表合并为1

在MySQL中将2个不同的表合并为1,mysql,sql,Mysql,Sql,我有两个不同的excel文件,我需要合并到MySQL中的一个表中。我已经以CSV格式导出了这两个文件,并将其导入到MySQL的两个不同表中 第一个表格(中央)包括: id、姓名、姓氏、地址、邮政编码、文件da、fieldB、fieldC、fieldD 第二张桌子(杂志)有: id(不同于“中心”id)、姓名、姓氏、地址、邮编、, 菲尔德克斯,菲尔迪,菲尔兹 目标是创建一个包含以下内容的表: id、姓名、姓氏、地址、邮政编码、fieldA、fieldB、fieldC、fieldD、, 菲尔德克斯,

我有两个不同的excel文件,我需要合并到MySQL中的一个表中。我已经以CSV格式导出了这两个文件,并将其导入到MySQL的两个不同表中

第一个表格(中央)包括:

id、姓名、姓氏、地址、邮政编码、文件da、fieldB、fieldC、fieldD

第二张桌子(杂志)有:

id(不同于“中心”id)、姓名、姓氏、地址、邮编、, 菲尔德克斯,菲尔迪,菲尔兹

目标是创建一个包含以下内容的表:

id、姓名、姓氏、地址、邮政编码、fieldA、fieldB、fieldC、fieldD、, 菲尔德克斯,菲尔迪,菲尔兹

主要问题是,在表“
Central
”中,我有几行(1000行),这些是主行。在表“Magazine”中,我有另一组行(也是1000行),但有些行存在于“Central”中,有些行不存在

我想做的是一个循环,可以创建另一个表,或者用“
杂志”更新“中心”表,更新两个表中存在的行,并为“杂志”表中刚刚存在的行插入新行

PK不一样,但我们可以假设配对名称、姓氏足以匹配两个表中的行


谢谢

在新表中,将
姓名
定义为唯一键,这样我们就可以对重复键使用
来检测匹配项

CREATE TABLE newtable ( /* field definitions */,
  UNIQUE INDEX (name, surname) );
然后首先从
Central
加载数据:

INSERT INTO newtable (id, name, surname, address, zip, fieldA, fieldB, fieldC, fieldD)
SELECT id, name, surname, address, zip, fieldA, fieldB, fieldC, fieldD
FROM Central;
现在合并
杂志
中的数据,用新字段更新匹配行

INSERT INTO newtable (id, name, surname, address, zip, fieldX, fieldY, fieldZ)
SELECT id, name, surname, address, zip, fieldX, fieldY, fieldZ
FROM Magazine
ON DUPLICATE KEY UPDATE id = VALUES(id), address = VALUES(address),
                        zip = VALUES(zip), fieldX = VALUES(fieldX),
                        fieldY = VALUES(fieldY), fieldZ = VALUES(fieldZ);

可能有一种方法可以在一个
INSERT
中完成所有操作,但由于MySQL没有
交叉连接
,因此它将成为编码的一个PITA。

如何定义:
两个表中都存在的行
?@AndriusNaruševičius阅读问题的最后一行:名称和姓氏识别duplicates@Barmar那么首先,,数据库结构错误。您好,Barmar,非常感谢您提供的帮助,帮助非常好,工作也很好(只需在值中添加一个S)。感谢您自己找到解决方法,而不仅仅是发布错误消息。我已经更新了答案,所以您现在可以接受。当存在重复名称时,此方法是否确保杂志中的行优先?由于
id
字段不同,您不会以多行结束吗?
create table new_table as select * from (   
 SELECT a.id, a.name, a.surname, a.address, a.zip, a.filedA, a.fieldB, a.fieldC, a.fieldD, b.fieldX, b.fieldY, b.fieldZ FROM Central a
    LEFT JOIN Magazine b ON (a.name = b.name and a.surname = b.surname)
    UNION
    SELECT b.id, b.name, b.surname, b.address, b.zip, a.filedA, a.fieldB, a.fieldC, a.fieldD, b.fieldX, b.fieldY, b.fieldZ FROM Central a
    RIGHT JOIN Magazine b ON (a.name = b.name and a.surname = b.surname) ) temp