Questa tecnica unisce la tabella contro se stessa in una sottoquery, ma corrisponde solo a una riga (basata su contact_id e corrispondenza e-mail. Il trucco è che la sottoquery restituisce solo uno degli indirizzi email usando MIN, in teoria il primo in ordine alfabetico (non affidabile, ma hai detto che non importa).
L'ho testato con buoni risultati.
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;