Denne teknik forbinder tabellen med sig selv i en underforespørgsel, men den matcher kun én række (baseret på kontakt_id og e-mail-matchning. Tricket er, at underforespørgslen kun returnerer én af e-mail-adresserne ved hjælp af MIN, teoretisk set den første alfabetisk (ikke pålidelig, men du sagde, at det ikke betød noget).
Jeg har testet dette med gode resultater.
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;