2010-03-27 16 views
8

Tengo una tabla de base de datos que tiene una restricción de clave única definida para evitar que se produzcan registros duplicados.Verificar registros duplicados VS try/catch Restricción de clave única

Tengo curiosidad si es una mala práctica NO verificar manualmente si hay registros duplicados antes de ejecutar una instrucción INSERT en la tabla.

En otras palabras, ¿debería ejecutar una instrucción SELECT utilizando una cláusula WHERE que comprueba los valores duplicados del registro que estoy a punto de INSERTAR? Si se encuentra un registro, entonces no ejecutar la sentencia INSERT, de lo contrario seguir adelante y ejecutar el INSERT ....

O

Sólo tiene que ejecutar la instrucción INSERT y tratar/detectar la excepción de que puedan ser lanzados por a una violación clave única.

estoy pesando los dos puntos de vista y no puedo decidir que es mejor- 1. No pierda una llamada SELECT para comprobar si hay duplicados cuando puedo atrapar una excepción VS 2. No se perezoso mediante la implementación fea lógica try/catch VS 3. ??? Sus pensamientos aquí ??? :)

Respuesta

7

Realmente tiene que usar el método try..catch. Puede ser menos elegante, pero es infalible.

Si hay más de un cliente actualizando esta tabla, entonces otro cliente puede insertar un registro entre su cheque y su inserción. Todavía puede verificar si desea, para guardar tratando de hacer la inserción innecesariamente. Puede ser un pequeño aumento en el rendimiento si eso es lo que le preocupa, pero solo si hay es un duplicado. Pero cada vez que no es un duplicado, ha pagado una penalización de rendimiento al hacer tanto un SELECT como un INSERT.

De todos modos, ¿cuáles son las probabilidades de que haya una violación de restricción? Probablemente pequeño, ¿por qué molestarse con el cheque?

3

Incluso si comprueba si hay duplicados, se puede insertar un nuevo elemento después de marcar y antes de insertarlo, por lo que todavía necesita el bloque try/catch.

3

Try/catch es más seguro y más escalable porque solo tocará la mesa una vez. El try/catch elimina el manejo de errores, francamente errático en las versiones anteriores

Ver lesson 4 from this article demasiado

Cuestiones relacionadas