Digo que no hagas eso, por dos razones:
- los mensajes de error son un poco confusos:ERROR 1062 (23000):Entrada duplicada 'xxx' para la clave 1 . ¿Estás siempre 100 % seguro de qué clave es 1?
- lo bloquea en un proveedor de base de datos específico
Me resulta más sencillo transaccionalmente :
- verificar la existencia de la fila;
- lanzar una excepción si la fila ya existe;
- insertar la nueva fila.
Problemas de rendimiento :
Yo digo medir dos veces, cortar una vez . Perfile el uso para su caso de uso específico. En lo más alto de mi cabeza, diría que el rendimiento no será un problema, excepto en los escenarios de uso intensivo de db.
La razón es que una vez que realiza un SELECT
sobre esa fila específica, sus datos se colocarán en los cachés de la base de datos y inmediatamente utilizado para la verificación de inserción realizada en el índice para el INSERT
declaración. Además, teniendo en cuenta que este acceso está respaldado por un índice, se llega a la conclusión de que el rendimiento no será un problema.
Pero, como siempre, mide.