Controlar Excepción "Duplicate Entry"

Controlar Excepción "Duplicate Entry"

A veces, a la hora de ingresar un registro a una tabla, es importante consultar o verificar si algún dato del registro que está por insertarse ya existe en la tabla, que no deba repetirse. De hecho ésto se puede controlar con sólo restringir el campo como único (unique). Por ejemplo, si se quiere registrar un "usuario" o  "funcionario", que mediante el dato que corresponde a "usuario" se corrobora su acceso a un sistema o cuenta, por ende este dato "usuario" no tiene que repetirse, es decir debe ser único por cada usuario. Pero si se establece dicho campo como unique, cuando se quiera registrar un "funcionario" con un usuario que ya ha sido utilizado por otro funcionario, lo que hará el constraint unique es lanzarnos una excepción indicando que el campo no puede tener valores repetidos. 
Hay dos maneras darle una solución a este problemilla:
1. Realizar una consulta respecto al campo en cuestión.
2. Capturar la excepción.

El método siguiente es para la consulta previa. 
Como podrán ver, primero se consulta si el campo "pers_cedula" (que es uniqueya se encuentra en la tabla, en el caso de ser cierto, se exhibe un mensaje indicando el nombre y apellido de la persona a la que pertenece ese dato. Si no se encuentra el campo "pers_cedula", se procede al ingreso de los datos.
La ventaja es que es muy sencilla de llevarla a cabo. La desventaja, podríamos decir, es que estamos haciendo el trabajo de la base de datos. además del uso innecesario de los recursos y del tiempo, puesto que si se tiene una gran cantidad de registros, el tiempo ya se vuelve considerable.

public static int RegistrarFuncionario(String cedula, "todos los demás datos"
{
        try {
            int ingresados = 0;
            conn = obtConexionPostgres();
            stmt = conn.createStatement();
            rset = stmt.executeQuery("SELECT nombre, apellido FROM personas WHERE pers_cedula=' "
                   +dato_unique+" ' ");
                if (rset.next())
               {
                   JOptionPane.showMessageDialog(null, "El Nro de C.I ingresado ya está registrado para: "+
                     rset.getString(1)+" "+rset.getString(2));
                }
                else 
               {
                     String query = "INSERT INTO tabla (campo1, campo2, campoNVALUES (?,?,?)";
                
                     pstmt = conn.prepareStatement(query);
                     pstmt.setString(1, campo1);
                     pstmt.setString(2, campo2);
                     pstmt.setString(3, campoN);
                     ingresados = pstmt.executeUpdate();
                }
                return ingresados;
        } 
        catch (SQLException e) 
        {
                JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
            
                return 0;
        }
    }

*****************************************************************************************************************
En este método, se atrapa la excepción que corresponde a intento ingresar datos duplicados.
Lo que hacemos es sólo preguntar si el Código de Error de la Excepción atrapada es igual al Código de Error para Duplicate Entry o Entidades Duplicadas (Campos Únicos) que es 1062. Si es igual significa que se está queriendo ingresar un dato en un campo unique que ya existe en la tabla.
Como lo pueden ver, es más seguro, fiable y eficiente, la desventaja podríamos decir que si se quiere atrapar cada una de las excepciones que nos puede lanzar una  operación es que se tiene que conocer los códigos en particular de cada exceptión.

public static int RegistrarFuncionario() 
{
        try {
            int ingresados = 0;
            conn = obtConexionPostgres();
            stmt = conn.createStatement();
            
            String query = "INSERT INTO tabla (campo1, campo2, campoN)  VALUES (?,?,?)";
                
                     pstmt = conn.prepareStatement(query);
                     pstmt.setString(1, nombre);
                     pstmt.setString(2, apellido);
                     pstmt.setString(3, cedula);
                     pstmt.setString(4, FechaNac);
                     pstmt.setString(5, nacionalidad);
                     pstmt.setString(6, estCivil);
                     pstmt.setString(7, direccion);
                     pstmt.setString(8, ciudad);
                     pstmt.setString(9, barrio);
                     pstmt.setString(10, telefono);
                     ingresados = pstmt.executeUpdate();
                
                return ingresados;
        } 
        catch (SQLException e) 
        {
            if (e.getErrorCode() == 1062)
                JOptionPane.showMessageDialog (null"¡Nro. de Cédula de Identidad ya existe!""Cédula Duplicada"
                       JOptionPane.ERROR_MESSAGE);
            
            else
                    JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
            
            return 0;
        }
    }

Comentarios

Entradas populares de este blog

Ejercicios para aprender AutoCAD 3D

Piezas 3D - interesantes

Cómo instalar una fuente de alimentación