none
Evitar insert de registros repidos RRS feed

  • Pregunta

  • Hola tengo una consulta, por favor necesito saber si existe alguna manera de envitar el ingreso de registros duplicados en una tabla, osea antes que Sql le asigne una cod primary key, desearia evitar el ingreso del mismo

     

    Por la ayuda les agradesco de antemano


    miércoles, 5 de mayo de 2010 21:35

Respuestas

  • La forma más eficaz (mejor que un trigger) es crear una constraint (unique key) sobre los campos que sean únicos. 

    Como alternativa puedes hacer que esta gente te deje los datos en una tabla temporal y no en la definitiva, y tu poner un procedimiento que haga un insert into tabla select distinct a,b,c,d from tutablatemporal..

     

    espero que se entienda


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    viernes, 7 de mayo de 2010 0:06
    Moderador
  • OswaldoJ,

    Dices que el software externo inserta data directamente en tu base de datos, correcto?

    Estoy de acuerdo con Miguel, debes tener una restriccion de unicidad (primary key o unique) para evitar duplicados. Ahora, si puedes hacer que esta aplicacion depocite la data en algun lugar y que luego tu puedas manipular esa data antes de insertarla, entonces no tienes problemas, pues existen varias formas mediante codigo de evitar insertar duplicados.

    Si por el contrario, la aplicacion insiste en insertar la data directamente, entonces deberas agregar una sugerencia a nivel de indice para ignorar los duplicados, puesto que a la final SQL Server implementa ambas restricciones (PK o U) mediante un indice unico.

    Ejemplo:

    USE tempdb;
    GO
    CREATE TABLE #T (
    c1 int NOT NULL IDENTITY(1, 1) PRIMARY KEY,
    c2 int NOT NULL UNIQUE WITH (IGNORE_DUP_KEY = ON)
    );
    
    INSERT INTO #T(c2) VALUES(1);
    INSERT INTO #T(c2) VALUES(1);
    INSERT INTO #T(c2) VALUES(1);
    
    SELECT * FROM #T;
    
    DROP TABLE #T;
    GO

    AMB

    lunes, 10 de mayo de 2010 15:37

Todas las respuestas

  • Hola.

    Pues es eso lo que debes hacer, ponerle clave primaria a las tablas. A lo mejor estás necesitando un campo autonumérico (un identity):

    create table MiTabla (Id int not null identity(1,1) primary key, Campo2 char(10) not null, Campo3 int not null)

    Si no es eso a lo que te refieres, nos dices.

     


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    miércoles, 5 de mayo de 2010 21:45
    Moderador
  • Hola muchas gracias por responder, pero no es la solucion que busco, te comento mi tabla ya tiene identity ya creado, el problema es el siguiente, tengo un software externo que no se desarrollo en la empresa, que envia registros a mi base directamente mediante un odbc, pero a veces son registros duplicados, suponia que podria crear una primary key compuesta pero no se si sea optimo puesto este software me envia como 12 parametros en cada registro, desearia que ese registro que es repetido no se inserte, no se mediante un trigger o alguna manera.

     

    Saludos


    Roger
    jueves, 6 de mayo de 2010 21:48
  • La forma más eficaz (mejor que un trigger) es crear una constraint (unique key) sobre los campos que sean únicos. 

    Como alternativa puedes hacer que esta gente te deje los datos en una tabla temporal y no en la definitiva, y tu poner un procedimiento que haga un insert into tabla select distinct a,b,c,d from tutablatemporal..

     

    espero que se entienda


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    viernes, 7 de mayo de 2010 0:06
    Moderador
  • ¡Hola!

    ¿Las informaciones fueran útiles para solucionar su problema?

    ¡Gracias!
    Rafael Fagundes - Marque la respuesta como correcta si te ha sido de utilidad!
    lunes, 10 de mayo de 2010 13:13
  • OswaldoJ,

    Dices que el software externo inserta data directamente en tu base de datos, correcto?

    Estoy de acuerdo con Miguel, debes tener una restriccion de unicidad (primary key o unique) para evitar duplicados. Ahora, si puedes hacer que esta aplicacion depocite la data en algun lugar y que luego tu puedas manipular esa data antes de insertarla, entonces no tienes problemas, pues existen varias formas mediante codigo de evitar insertar duplicados.

    Si por el contrario, la aplicacion insiste en insertar la data directamente, entonces deberas agregar una sugerencia a nivel de indice para ignorar los duplicados, puesto que a la final SQL Server implementa ambas restricciones (PK o U) mediante un indice unico.

    Ejemplo:

    USE tempdb;
    GO
    CREATE TABLE #T (
    c1 int NOT NULL IDENTITY(1, 1) PRIMARY KEY,
    c2 int NOT NULL UNIQUE WITH (IGNORE_DUP_KEY = ON)
    );
    
    INSERT INTO #T(c2) VALUES(1);
    INSERT INTO #T(c2) VALUES(1);
    INSERT INTO #T(c2) VALUES(1);
    
    SELECT * FROM #T;
    
    DROP TABLE #T;
    GO

    AMB

    lunes, 10 de mayo de 2010 15:37
  • Para evitar registros duplicados al insertar en una tabla con una PK del tipo identity, lo que suelo hacer es hacer una relación tipo Left/right outer join con una clave candidata, y poniendo una restricción que sea nulo en la tabla de destino:

    Insert into Table1 (Name)

    select name

    from Table2

    left join Table1 on Table1.name=Table2.name

    where Table1.name is null

    Asi solo se seleccionan los registros que no existen en el destino para que sean insertados.

    • Propuesto como respuesta F.Racionero martes, 11 de mayo de 2010 10:13
    martes, 11 de mayo de 2010 10:13
  • está perfecto F. Racionero, aunque me he encontrado algún caso en el que falla si vienen duplicados desde el propio origen, yo soluciono eso añadiendo un distinct

    insert into Table1 (campos)

    select distinct  t2.*

    from table2 t2 left join table1 t1 on t2.claves=t1.claves

    where t1.clave is null

    por si sirve de algo :)


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    martes, 11 de mayo de 2010 10:16
    Moderador
  • Gracias por tu comentario me sirvio mucho para evitar insertar duplicados, tengo una llave de dos campos, solo cambie la parte que dice:   left join Table1 on Table1.name=Table2.name   POR  left join Table1 on Table1.name=Table2.name and Table1.name2 =Table2.name2

    ------------------------------------

    cuando la llave es de un solo campo regularmente uso: 

     insert into table1 (name)

    select name from table2 where name not in (select name from table1)

    -----------------------------------------------------------

    Pero siempre le habia batallado con tablas con llaves compuestas.

     

    gracias..

    martes, 26 de octubre de 2010 16:43