【问题标题】:Update existing rows with values of new row if given field is identical如果给定字段相同,则使用新行的值更新现有行
【发布时间】:2021-09-24 08:19:44
【问题描述】:

我的 MySQL 知识有点不稳定。我有一个包含(除其他外)以下列/值的表:

ID | importID | distID | email     | street       | city
-----------------------------------------------------------
25 | 5        | 2      | abc@d.com | Main Road    | London
-----------------------------------------------------------
26 | 5        | 2      | mno@e.com | Oak Alley    | York
-----------------------------------------------------------
27 | 5        | 2      | pqr@s.com | Tar Pits     | London
-----------------------------------------------------------
28 | 5        | 2      | xyz@a.com | Fleet Street | London
-----------------------------------------------------------
...
-----------------------------------------------------------
99 | -1       | 2      | abc@d.com | New Street   | Exeter

在插入新行时我会进行一些检查:验证电子邮件地址,查找具有不同 dist(ributor)ID 的双拼等。

其中一项任务是“当“电子邮件”列相同时,使用新导入行的数据更新现有行”(是的,可以有多个具有相同电子邮件地址的行)。

在执行此任务时,当前插入的行的 importID 始终为 -1。我尝试了各种变体的别名

UPDATE table orig table dup
SET orig.street = dup.street, orig.city = dup.city
WHERE orig.email = dup.email

或加入多种变体

UPDATE table orig
JOIN 
  (SELECT email FROM table
  WHERE importID != -1) dup
ON orig.email = dup.email
SET orig.street = dup.street, orig.city = dup.city

我的错误是什么?

【问题讨论】:

  • 我不同意这种方法。您应该避免像这样存储重复信息,或者,如果必须,则使用时间戳来区分当前信息和旧信息。
  • 我明白你的意思。这种方法背后的要点是我有一个包含所有数据的大表。记录可以来自不同的进口,属于不同的分销商等等。我可以使用 importID 区分现有行和新行 - 但是当从 csv 文件导入记录时,尚未创建该导入记录。这就是为什么新的导入会得到 -1,稍后会更改为正确的导入 ID。我可以改变它,但这意味着相当多的工作和时间——我目前没有……:(
  • 如果可以,请将示例表数据添加到您的问题中。
  • 添加了示例数据并更改了应更新的字段名称,因为地址更改而不是名称更改的可能性更大;)
  • 那么您的问题到底是什么?用 import id = -1 的记录更新所有 import id -1 的记录?

标签: mysql sql-update sql-insert


【解决方案1】:

不要那样做。

将重复的电子邮件信息存储在单独的表中。该表将包含等待分析和确认的记录;不要尝试将它们包含在主表中。

这个额外的表可以有多行相同的电子邮件,但主表不能。

处理未决更改的人将在两个表(两个 Select 或一个 Union)中使用 SELECT,做出决定并按下按钮。一键会说扔新信息;有人会说替换;等等

并且,正如 Tim 所建议的,在每个表中都有一个 TIMESTAMP。这将有助于用户进行更改,尤其是在有多个未决更改的情况下。

【讨论】:

    【解决方案2】:

    鉴于改变方法会更好,您可以将您的要求编码如下:

    UPDATE mytab INNER JOIN mytab AS newrec ON mytab.email=newrec.email AND newrec.importID=-1
       SET mytab.street=newrec.street, mytab.city=newrec.city;
    

    示例

    之前

    ID  importID distID email       street       city
    25  5        2      abc@d.com   Main Road    London
    26  5        2      mno@e.com   Oak Alley    York
    27  5        2      pqr@s.com   Tar Pits     London
    28  5        2      xyz@a.com   Fleet Street London
    99  -1       2      abc@d.com   New Street   Exeter
    100 -1       2      pqr@s.com   foo          bar
    

    之后

    ID  importID distID email       street       city
    25  5        2      abc@d.com   New Street   Exeter
    26  5        2      mno@e.com   Oak Alley    York
    27  5        2      pqr@s.com   foo          bar
    28  5        2      xyz@a.com   Fleet Street London
    99  -1       2      abc@d.com   New Street   Exeter
    100 -1       2      pqr@s.com   foo          bar
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 2016-01-17
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      相关资源
      最近更新 更多