如果给定字段相同,则使用新行的值更新现有行
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
我的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