none
Evitar el ingreso de registros duplicados comparando varios campos. RRS feed

  • Pregunta

  • Estimados,

    quisiera saber si alguien me puede ayudar, estoy haciendo un pequeño programa en visual basic y  como base de datos  una en mysql,  tengo una tabla, en la cual existen varios  campos por ejemplo: ID, nombre , apellido,  provincia, canton, parroquia, fecha de registro  y hora de registro:

    el id es autonumerico, asi que no se podra repetir,  pero  el resto de campos se pueden repetir: nombre, apellido, provincia, canton, ciudad, pero  no se pueden registrar el mismo dia y hora,  puede ser  en otra fecha y hora, pero no el mismo dia, por ejemplo:

    ID    nombre       apellido     provincia       canton        ciudad        fecha                  hora

    1      patricio        ramos      pichincha        quito         San blas    25/04/1981          20:15   ----->>> registro  ingresado valido

    2      patricio        ramos      pichincha        quito         San blas    25/04/1981          20:15   ----->>> registro repetido no valido

    3      patricio        ramos      pichincha        quito         San blas    25/05/1981          10:15   ----->>> registro  ingresado valido

    este  ejemplo es como para realizar un historico de ingresos, pero que  por ejemplo al digitar  los campos a menos que sean en otra fecha u hora,  den como repetido  el registro.

    mul gracias  por sua ayuda

    Patricio

    martes, 14 de julio de 2015 14:10

Respuestas

  • No sé. Yo también he tenido mis dudas.

    El principal problema me parece un problema de diseño de la base de datos. En cualquier caso si se va a hacer un número alto de inserciones consecutivas habría que hacer una consulta previa por cada inserción y con una where por las 6 columnas, con lo que si se van a hacer un número tan alto de consultas por las 6 columnas podría venir hasta bien tener el índice.

    Por otro lado entiendo que en muy pocos casos se dará el error por lo que con el índice único te ahorras un montón de consultas.

    No sé, yo también soy muy reacio a meter cualquier tipo de lógica en base de datos, pero en este caso tengo mis dudas.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 14 de julio de 2015 21:28

Todas las respuestas

  • Hace mucho que no trabajo con MySql, pero creo recordar que soportaba claves únicas. Busca por mysql Unique Key o Unique Constraint.

    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 14 de julio de 2015 14:15
  • Gracias por responder, pero ese criterio solo funcionaria si tuviera un campo codigo unico, pero necesito validar varios campos para saber si esta o no repetido el registro...

    de todas formas gracias por  el aporte..

    martes, 14 de julio de 2015 14:29
  • Pero puedes crear una clave única de varias columnas:

    ALTER TABLE 'Tabla' ADD UNIQUE 'unique_index'('nombre', 'apellido', 'provincia', 'fecha', 'hora');


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 14 de julio de 2015 14:45
  •  Buenas tardes, creo que lo primero que deberias hacer es separar esos datos en dos tablas, ya que estas generando mucha redundancia... podrias dejar algo asi como...

    Tabla 1
    Id_Usuario    nombre       apellido     provincia       canton        ciudad       

    Tabla 2

    Id_Usuario      fecha          hora

     Entonces en la tabla 1 administrarias todo lo que vendria siendo la info personal del usuario y luego la Tabla 2 vendria a ser los Login que realize... Ahora, si quieres restringir el acceso a una vez al día o tener solo un registro diario, entonces debes crear una consulta que cuente la cantidad de registros existentes en ese dia para un id de usuario
    (ejemplo) "Select Count(Id_Usuario) from Tabla 2 where fecha = (fecha a comparar) and Id_Usuario = (id del usuario que se esta registrando)" , realizas un execute scalar a esa consulta y ves cuantos registros cuenta... si el count > 0, entonces sabes que ya se registro en esa fecha/hora y mandas un mensaje de error... si el count es = 0 entonces ingresas el registro nuevo...


    Saludos, Lucas Petruzzella

    martes, 14 de julio de 2015 15:09
  • mmm, entiendo...

    pero  al ser valores unicos, nunca me permitiria ingresar  cualquier registro donde se duplique alguno de esos campos,  pero como dije en el ejemplo de lo que deseo hacer es  que se pueda ingresar la misma informacion siempre y cuando no sea  la misma fecha  u hora.. 

    ID nombre   apellido  provincia    canton  ciudad        fecha             hora

    1 patricio    ramos     pichincha   quito    San blas    25/04/1981     20:15   ----->>> registro  ingresado valido

    2 patricio     ramos     pichincha   quito    San blas    25/04/1981     20:15   ----->>> registro repetido no valido

    3 patricio    ramos      pichincha   quito    San blas    25/05/1981     10:15   ----->>> registro  ingresado valido

    4 patricio    rios           pichincha   quito    centro       25/05/1981     20:15   ----->>> registro  ingresado valido

    es decir si se repiten estos cuatro campos (nombre, apellido, provincia y ciudad) se puedan guardar las veces que quiera  siempre y cuando no sean  el mismo  dia y hora, pero si son otros datos si se  pueden ingresar el mismo dia  tomando como ejemplo los registros con id  1 y 3 que son repetidos  a esepcion de fecha y hora y los registros 2 y 4   que son diferentes en  un campo  y diferencia el registro, pero  estan en la misma fecha y hora...

    saludos  cordiales..

    martes, 14 de julio de 2015 15:21
  • Por eso al crear una restricción única multicolumna te va a dejar insertar siempre que no se repita la combinación de todos los campos especificados.

    ALTER TABLE 'Tabla' ADD UNIQUE 'unique_index'('nombre', 'apellido', 'provincia', 'ciudad', 'fecha', 'hora');


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 14 de julio de 2015 18:42
  • Hola Asier,

    la verdad es que funciona, pero a nivel de la base de datos,  es muy buena tu solucion, pero  no se  si se podria hacer  con programacion  validando desde el evento  click de un boton por ejemplo... se ejecute esa comprobacion  y se ejecute...

    martes, 14 de julio de 2015 21:09
  • Sí podrías hacer una consulta antes de insertar para comprobar que no existe ningún registro con los mismos datos, pero en este caso yo dejaría la validación en la base de datos encerrando el INSERT en un try catch y, en caso de error, sacar el mensaje correspondiente.

    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 14 de julio de 2015 21:12
  • Hola Astaroth250581,

    Proteger de inconsistencias la BD es correcto, pero yo no llevaría al extremo una regla de negocio. Es decir, crear un índice único compuesto de 6 columnas, no sé si justifique el costo de la validación.

    Por otro lado, está regla que más parece ser de negocio lo deberías trabajar en tu capa de negocio, y es tan simple como preguntar antes de la inserción si ya existe una coincidencia de valores de las columnas en mención.

    select count(*) from MiTabla where (Campo1 = @Campo1) and (Campo2 = @Campo2)...

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ

    martes, 14 de julio de 2015 21:18
  • No sé. Yo también he tenido mis dudas.

    El principal problema me parece un problema de diseño de la base de datos. En cualquier caso si se va a hacer un número alto de inserciones consecutivas habría que hacer una consulta previa por cada inserción y con una where por las 6 columnas, con lo que si se van a hacer un número tan alto de consultas por las 6 columnas podría venir hasta bien tener el índice.

    Por otro lado entiendo que en muy pocos casos se dará el error por lo que con el índice único te ahorras un montón de consultas.

    No sé, yo también soy muy reacio a meter cualquier tipo de lógica en base de datos, pero en este caso tengo mis dudas.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 14 de julio de 2015 21:28