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'的两个表之间的多列更新的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 多列上的多对多同步()

将一张表中的多行合并到 SQL 查询结果集中的多列中

有两个mysql表,两个表中的字段一样,其中一个表更新的时候,另一个表也会更新,怎样做到呢?

MySQL外键(详解)

sql数据库中,如何将一个表中的多列数字合并为一列

关于多对多关系表做一个级联更新的问题(MYSQL),求高手解答SQL语句