2

contacts列、、、、、、index_idを含むテーブルnameaddressありphone1ます。phone2phone3

長年にわたる不十分な管理のために、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);

私はすべての複製をphone3に移動*してみました

update contacts 
set phone3 = phone1
where count(phone3) > 1;

しかし、それはグループ関数の無効な使用法です。

これにはサブクエリが必要になると思います。そこで混乱し始めます。何か提案はありますか?

* moveは、データが存在しなくなりphone1、むしろ存在することを意味しphone3ます。とのようphone1 = NULLphone3 = data

4

1 に答える 1

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
于 2012-12-18T18:07:04.180 に答える