MySQL supporte parfaitement les contraintes uniques.
Cependant, il ne prend pas en charge les contraintes/index partiels, vous devrez donc marquer les images non primaires avec un NULL au lieu de 0 .
ALTER TABLE file ADD CONSTRAINT ux_file_customer_primary
UNIQUE (customerId, isPrimaryImage)
Vous pouvez insérer un nombre arbitraire de NULL valeurs dans isPrimaryImage mais une seule valeur non nulle par client.