Deze techniek voegt de tabel samen met zichzelf in een subquery, maar komt slechts overeen met één rij (gebaseerd op contact_id en e-mail matchen. De truc is dat de subquery slechts één van de e-mailadressen retourneert met MIN, theoretisch de eerste alfabetisch (niet betrouwbaar, maar je zei dat dat niet uitmaakte).
Ik heb dit met goede resultaten getest.
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;