Тази техника свързва таблицата срещу себе си в подзаявка, но съвпада само с един ред (въз основа на contact_id и съвпадение на имейли. Номерът е, че подзаявката връща само един от имейл адресите, използвайки MIN, теоретично първия по азбучен ред (не е надежден, но казахте, че няма значение).
Тествах това с добри резултати.
UPDATE
email
JOIN (SELECT contact_id, MIN(email) as email
FROM email GROUP BY contact_id) as singles
USING(contact_id, email)
set is_primary=1;