MySQL中带有'SET'的两个表之间的多列更新
Posted
技术标签:
【中文标题】MySQL中带有\'SET\'的两个表之间的多列更新【英文标题】:Multiple column update between two table with 'SET' in MySQLMySQL中带有'SET'的两个表之间的多列更新 【发布时间】:2020-01-26 05:42:04 【问题描述】:我有两张如下表。
表 A:
ResultID(PK) | ImportDate | Comment1
-------------------------------------
101 | 25-09-2019 | One
--------------------------------------
102 | 25-09-2019 | Two
--------------------------------------
103 | 25-09-2019 | Three
----------------------------------------
表 B:
ResultID(PK) | ImportDate | Comment2
-------------------------------------
101 | 26-09-2019 | new one
--------------------------------------
104 | 26-09-2019 | four
--------------------------------------
所以输出应该是这样的
表 A:
ResultID(PK) | ImportDate | Comment1
-------------------------------------
101 | 26-09-2019 | new one
--------------------------------------
102 | 25-09-2019 | Two
--------------------------------------
103 | 25-09-2019 | Three
--------------------------------------
104 | 26-09-2019 | four
--------------------------------------
问题:
如果ResultID
在表A和表B之间匹配,我想得到上面提到的结果表A,我想为ResultID
更新表B中表A中的所有列。如果表 B 中的ResultID
不存在于表 A 中,则将其插入表 A。
我在 MySQL 中的尝试:
UPDATE TableA
SET comment1=
(SELECT comment2 FROM TableB WHERE TableA.ResultId=TableB.ResultId);
上述解决方案仅适用于更新表 A 的一列。我还尝试使用来自的多列更新参考 SQL Server 2005 implementation of mysql REPLACE INTO? 但多列更新不适用于我的场景。
对于我的真实场景 - 我有 40 列和 50,000 行。
您能给我一些提示或解决方案吗?谢谢你。
【问题讨论】:
我认为您正试图避免包含 40 列,但除非您正在执行动态 sql,否则您将不走运。只需使用下面显示的解决方案之一添加 40 列。 【参考方案1】:由于您在ResultID
上有一个主键,您可以简单地使用INSERT ... ON DUPLICATE KEY UPDATE
查询将所有数据从TableB
传输到TableA
:
INSERT INTO TableA (ResultID, ImportDate, Comment1)
SELECT ResultID, ImportDate, Comment2 FROM TableB
ON DUPLICATE KEY UPDATE
ImportDate = VALUES(ImportDate),
Comment1 = VALUES(Comment1);
输出:
ResultID ImportDate Comment1
101 26-09-2019 new one
102 25-09-2019 Two
103 25-09-2019 Three
104 26-09-2019 four
Demo on dbfiddle
【讨论】:
当 ResultId 不是主键时,有什么方法可以找到相同的输出? @Jay 这要复杂得多。您能否将ResultId
设为唯一键(不一定是主键)。以上是关于MySQL中带有'SET'的两个表之间的多列更新的主要内容,如果未能解决你的问题,请参考以下文章