Podrías estar ejecutando esto con un bloque try catch:
try {
$prep->execute($values);
// do other things if successfully inserted
} catch (PDOException $e) {
if ($e->errorInfo[1] == 1062) {
// duplicate entry, do something else
} else {
// an error other than duplicate entry occurred
}
}
También puede buscar alternativas como "INSERTAR IGNORAR" e "INSERTAR ... EN LA ACTUALIZACIÓN DE CLAVE DUPLICADA", aunque creo que son específicos de MySQL e irían en contra de la portabilidad del uso de PDO, si eso es algo que le preocupa. .
Editar:para responder más formalmente a su pregunta, para mí, la solución n. ° 1 (el programador defensivo) en uso completo elimina efectivamente el punto de la restricción única en primer lugar. Así que estoy de acuerdo con su idea de dejar que MySQL se encargue de la verificación de datos.