Mysql 将重复的电子邮件更新为其他值

Mysql 将重复的电子邮件更新为其他值,mysql,Mysql,我有一个用户表,其中电子邮件列不是唯一的。不幸的是,有重复电子邮件的记录 我需要将此表导入电子邮件列唯一的另一个用户表中 我正在考虑将任何重复的电子邮件更新为不同的值,以便不再有重复的邮件 例如,如果我在同一封电子邮件中有三条记录example@example.com. 然后保留其中一个,并将其他两个更新为example@example.com[随机字符串] 我应该运行哪些SQL语句来实现这一点?谢谢 编辑: 用于测试Gordon溶液的表- 结果- 您可以使用以下变量: select conca

我有一个用户表,其中电子邮件列不是唯一的。不幸的是,有重复电子邮件的记录

我需要将此表导入电子邮件列唯一的另一个用户表中

我正在考虑将任何重复的电子邮件更新为不同的值,以便不再有重复的邮件

例如,如果我在同一封电子邮件中有三条记录example@example.com. 然后保留其中一个,并将其他两个更新为example@example.com[随机字符串]

我应该运行哪些SQL语句来实现这一点?谢谢

编辑:

用于测试Gordon溶液的表-

结果-

您可以使用以下变量:

select concat(u.email,
              (case when @e = email then concat('[', @rn := @rn + 1, ']')
                    when (@e := email) is null then '' -- never happens
                    when (@rn := 1) is null then '' -- never happens
                    else ''
               end))
from users u cross join
     (select @e := '', @rn := 0) params
order by u.email;
编辑:

嗯,上述内容在SQL Fiddle中不起作用,但此版本:


你只是失去了你的用户。。。这是在生产中吗?这张表中有自动增量吗?把那张桌子备份一下。当您执行删除操作时,还要确定您的更改是否即将违反FK,以及FK是否已准备就绪。修复数据,删除未使用的副本。为Email设置唯一的密钥。因此,只需更改电子邮件,系统中仍会保留大量垃圾邮件。我不会更改电子邮件。为了保证数据的完整性,我会把它们折叠起来。在丢失相关数据之前,请清理并保留重要内容。然后清除删除的未使用的。然后将唯一索引放在适当的位置。这是供内部使用的,通常是夫妻/家庭使用同一封电子邮件,但他们的身份不同;查看与您的MySQL服务器版本对应的手册,了解要使用的正确语法,第7BTW行的“from test u cross join select@e:=,@rn:=0 params order by u.email”,我比您以前使用过的嵌入式if语句更喜欢这种方法。在一个子句中加号集rn的理解更加清晰。谢谢,但仍然得到了以下结果:非法混合排序规则utf8_general_ci、IMPLICIT和utf8_unicode_ci、IMPLICIT for operation“=”,如果运行成功,此语句是否更新表?因为这就是我需要的。谢谢@肖恩。不需要更新表。可以使用此选择填充第二个表。至于排序规则,您需要使用COLLATE设置适当的排序规则,请参见。列与服务器具有不同的排序规则是不常见的,但在某些情况下它是有用的。
select concat(u.email,
              if(@e = u.email, concat('[', @rn := @rn + 1, ']'),
                 if(@e := u.email, if(@rn := 1, '', ''), '')
                )
             ), @e, @rn
from users u cross join
     (select @e := '', @rn := 0) params
order by u.email;