mysql更新将重复项移动到其他列

mysql更新将重复项移动到其他列,mysql,Mysql,我有一个表contacts,其中包含列index\u id,name,address,phone1,phone2,phone3 由于多年来管理不善,484097行中有212019行phone1不是唯一的。但是,每个记录都是唯一的记录 我需要phone1保持唯一性,但我不想丢失212k条记录 phone3是一个新列,每个记录都为空。我的想法是,我可以简单地将*值(phone1)移动到phone3 我尝试了这个查询,但不理解重复更新只会更新以前存在的记录 insert into tmp select

我有一个表
contacts
,其中包含列
index\u id
name
address
phone1
phone2
phone3

由于多年来管理不善,484097行中有212019行
phone1
不是唯一的。但是,每个记录都是唯一的记录

我需要
phone1
保持唯一性,但我不想丢失212k条记录

phone3
是一个新列,每个记录都为空。我的想法是,我可以简单地将*
值(phone1)
移动到
phone3

我尝试了这个查询,但不理解重复更新只会更新以前存在的记录

insert into tmp select * from contacts
on duplicate key update phone3 = values(phone1);
我试着把所有的副本移到phone3上

update contacts 
set phone3 = phone1
where count(phone3) > 1;
但这是对组函数的无效使用

我想这需要一个子查询,这就是我开始感到困惑的地方。有什么建议吗


*移动意味着数据将不再位于
phone1
中,而是位于
phone3
中。与
phone1=NULL
phone3=data
一样,这将把所有重复的phone1移动到phone3列。对于存在重复项的每个记录,Phone1都将设置为null:

UPDATE
  contacts c1 inner join (select phone1
                          from contacts
                          group by phone1
                          having count(*)>1) c2
  on c1.phone1=c2.phone1
SET
  c1.phone1=null, c1.phone3=c1.phone1

c1.phone1=c2.phone1
?另外,这如何处理同一电话号码的不同姓名?(可能也是同一个地址)@ebyrob谢谢,我拼错了phone1,现在没事了!此查询不处理具有相同电话号码的不同姓名,我可以在子查询和on条件上再添加一个coulmn,但我认为这是OP想要的…我需要验证数据,然后才能接受答案,但在我的开发数据库上进行测试后。。。fthiella的查询似乎完成了任务,而且速度也很快。为什么phone1是唯一的?同一个家庭(或小办公室)的人呢?您是否遇到重复条目的问题,或者出于某种原因只想强制phone1为唯一或空?分析:
从联系人组中逐个选择电话1、通话组(不同的名称)、通话组(不同的地址),电话1的计数(*)大于1
示例输出是什么?是的,我们所有的联系人都是小型办公室。此表提供了各种营销工具。在phone1中为10人提供相同的电话号码意味着同一办公室可以联系10次。即使该办公室已被要求从联系人名单中删除。因此,我们不想丢失数据,但我们希望phone1是唯一的。我对email1也做了同样的事情。但是那张复制品的清单太小了,我只是用手移动了一下。