Ta technika łączy tabelę ze sobą w podzapytaniu, ale pasuje tylko do jednego wiersza (na podstawie contact_id i dopasowanie wiadomości e-mail. Sztuczka polega na tym, że podzapytanie zwraca tylko jeden adres e-mail przy użyciu MIN, teoretycznie pierwszy w kolejności alfabetycznej (nie jest wiarygodny, ale powiedziałeś, że to nie ma znaczenia).
Przetestowałem to z dobrymi wynikami.
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;