我有一个表contacts
,其中包含index_id
,name
,address
,phone1
,phone2
,phone3
列
由于多年来管理不善,484,097中有212,019行phone1
并非独特。但是,每条记录都是唯一的记录。
我需要phone1
是唯一的,但我不想丢失212k记录。
phone3
是一个新列,对于每条记录都为null。我的想法是,我可以简单地将VALUES(phone1)
移到phone3
我尝试了这个查询,但没有理解ON DUPLICATE UPDATE会简单地更新以前存在的记录。
insert into tmp select * from contacts
on duplicate key update phone3 = values(phone1);
我尝试将所有重复内容移动到带有
的phone3update contacts
set phone3 = phone1
where count(phone3) > 1;
但这是对群组功能的无效使用。
我认为这将需要一个子查询,这就是我开始感到困惑的地方。有什么建议吗?
* move表示数据不再位于phone1
,而是位于phone3
。与phone1 = NULL
和phone3 = data
答案 0 :(得分:5)
这会将所有重复的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