Diese Technik verbindet die Tabelle in einer Unterabfrage mit sich selbst, stimmt aber nur mit einer Zeile überein (basierend auf contact_id und E-Mail-Abgleich. Der Trick besteht darin, dass die Unterabfrage nur eine der E-Mail-Adressen mit MIN zurückgibt, theoretisch die erste alphabetisch (nicht zuverlässig, aber Sie sagten, das sei egal).
Ich habe dies mit guten Ergebnissen getestet.
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;