如果给定字段相同,则使用新行的值更新现有行

Update existing rows with values of new row if given field is identical

我的MySQL知识有点不稳定。我有一个 table 与(除其他外)以下 columns/values:

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

我的错误是什么?

不要那样做。

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

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

处理未决更改的人会在两个 table 中使用 SELECT(两个选择或联合),做出决定,然后按下按钮。一个按钮会说扔掉新信息;有人会说要更换;等等

并且,正如 Tim 建议的那样,每个 table 中都有一个 TIMESTAMP。这将有助于用户进行更改,尤其是在有多个待定更改的情况下。

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

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