Mysql 使用表B中的所有新条目更新表A,并通过B更新A中的现有条目

Mysql 使用表B中的所有新条目更新表A,并通过B更新A中的现有条目,mysql,Mysql,我有一个表a,其中包含几个带有条目的列。第1列中是唯一的活动名称。表A包含所有相关的历史数据。 我还有另一个表B,它也包含相同的列和条目。表B中的某些条目也可以存在于表A中(活动名称与表A相同),但可以(不必)在其他列中包含不同的条目。B是我用(一些)新数据更新的表 现在我想做的是: 我希望将表B中的所有新条目(第1列中的活动名称尚未在表中的行)完全添加到A,并使用其他列中的不同条目更新/替换现有条目(第1列中的活动名称已在A中的行) 下面是一个例子: 例如,如果表A包含: |col1

我有一个表a,其中包含几个带有条目的列。第1列中是唯一的活动名称。表A包含所有相关的历史数据。 我还有另一个表B,它也包含相同的列和条目。表B中的某些条目也可以存在于表A中(活动名称与表A相同),但可以(不必)在其他列中包含不同的条目。B是我用(一些)新数据更新的表

现在我想做的是: 我希望将表B中的所有新条目(第1列中的活动名称尚未在表中的行)完全添加到A,并使用其他列中的不同条目更新/替换现有条目(第1列中的活动名称已在A中的行)

下面是一个例子:

例如,如果表A包含:

|col1                           ||col2   ||col3|
+-----+
|20161512_NL_Luxus_1_DE         ||Andrea ||29 |
|20161217_LC_YoBirthdayNo_A_CH  ||Oscar  ||38 |
|20161512_NL_SDT_4_DE           ||James  ||44 |
|20170117_SV_YoBirthdayYes_A_DE ||Julia  ||57 | 
|col1                           ||col2   ||col3|
+------+
|20161512_NL_SDT_4_DE           ||James  ||44 |
|20170117_SV_YoBirthdayYes_A_DE ||George ||12 | 
|20161230_LC_YoBirthdayNo_A_CH  ||Hank   ||97 | 
|20170101_SV_YoBirthdayYes_A_DE ||Selma  ||77 | 
表B包括:

|col1                           ||col2   ||col3|
+-----+
|20161512_NL_Luxus_1_DE         ||Andrea ||29 |
|20161217_LC_YoBirthdayNo_A_CH  ||Oscar  ||38 |
|20161512_NL_SDT_4_DE           ||James  ||44 |
|20170117_SV_YoBirthdayYes_A_DE ||Julia  ||57 | 
|col1                           ||col2   ||col3|
+------+
|20161512_NL_SDT_4_DE           ||James  ||44 |
|20170117_SV_YoBirthdayYes_A_DE ||George ||12 | 
|20161230_LC_YoBirthdayNo_A_CH  ||Hank   ||97 | 
|20170101_SV_YoBirthdayYes_A_DE ||Selma  ||77 | 
我需要一个将更新表a的查询,如下所示:

|col1                           ||col2   ||col3|
+-----+
|20161512_NL_Luxus_1_DE         ||Andrea ||29 |
|20161217_LC_YoBirthdayNo_A_CH  ||Oscar  ||38 |
|20161512_NL_SDT_4_DE           ||James  ||44 |
|20170117_SV_YoBirthdayYes_A_DE ||George ||12 | 
|20161230_LC_YoBirthdayNo_A_CH  ||Hank   ||97 | 
|20170101_SV_YoBirthdayYes_A_DE ||Selma  ||77 |
这就是我到目前为止得到的:

INSERT INTO A SELECT * FROM B WHERE `col1` NOT IN (SELECT `col1` FROM `A`);
->但这只是解决方案的一部分

不幸的是,我不知道如何解决这个问题……:/


提前谢谢

如果
col1
主键
,您可以尝试以下操作:

    INSERT INTO A 
    SELECT * FROM B ON DUPLICATE KEY
    UPDATE col2=VALUES(col2), col3=VALUES(col3);

实际上,“20161512”是您预期结果的两倍,对吗?我认为您需要在表B到表A中插入值。是的:但
20161512
不是完整的活动名称-它只是它的第一部分(
20161512_NL_Luxus_1_DE
20161512_NL_SDT_4_DE
是完整的活动名称):
20161512|u NL|u Luxus|1|DE|安德烈| 29 |
20161512|u NL|u SDT|u 4|DE|詹姆斯| 44 |
都应该出现在我的结果中,但每次只有一次我自己找到答案。。。这样行吗<代码>更新A.col1=B.col1集合A.col2=B.col2,A.col3=B.col3上的内部联接B(依此类推),然后
插入到A SELECT*FROM B,其中col1不在(从
A中选择col1)`我知道-这不是最优雅的方式…但它会起作用吗?!