none
¿Como evitar valores repetidos en una columna que acepta null? RRS feed

Respuestas

  • Hola jeduardonl,

    En base a la sugerencia de Enrique (la de usar un índice filtrado)  que por cierto lo desconocía, hice mis pruebas y te lo comparto, de hecho es la solución para el requerimiento que presentas

    /*Creamos la tabla temporal*/
    create table #Prueba (id int identity(1,1) primary key, fecha date null);
    go
    
    /*Creas un indice unico filtrado, OJO al WHERE*/
    create unique nonclustered index "IX_IUNull" on #Prueba (fecha) where fecha is not null;
    go
    
    /*Inserto valores NULL duplicados*/
    insert into #Prueba values ('01/01/2015'),(Null),('02/01/2015'), (Null),('03/01/2015');
    select * from #Prueba;
    go
    
    /*Sigo insertando valores null*/
    insert into #Prueba values (Null), (Null)
    select * from #Prueba;
    go
    
    /*La siguiente inserción no es permitida porque ya existe la fecha*/
    insert into #Prueba values ('01/01/2015')
    select * from #Prueba;
    go
    
    /*Borramos la tabla temporal, no me gusta esperar :)*/
    drop table #Prueba;
    


    • Marcado como respuesta jeduardonl miércoles, 5 de agosto de 2015 14:50
    martes, 4 de agosto de 2015 22:24

Todas las respuestas

  • Saludos Jeduardonl

    Teoricamente no se puede hacer lo que dices, aunque aqui te dan una idea de como darle la vuelta.

    http://dba.stackexchange.com/questions/80514/why-does-a-unique-constraint-allow-only-one-null

    • Propuesto como respuesta Willams Morales martes, 4 de agosto de 2015 21:59
    martes, 4 de agosto de 2015 21:34
  • Hola jeduardonl,

    Me temo que algo simple no hay, una restricción UNIQUE nos hubiera servido perfectamente, pero de igual manera validará que sólo tengas un valor NULL en la columna.

    Yo haría lo siguiente:

    1. Podrías definir un trigger iNSTEAD OF que valide el número de ocurrencias para un valor y realice la transacción en caso sea un valor único.
    2. Si la base de datos la usas desde una aplicación, la aplicación debería implementar la lógica necesaria para evitar guardar datos duplicados.

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

    Willams Morales
    Arequipa - PERÚ


    martes, 4 de agosto de 2015 21:41
  • Saludos Jeduardonl

    Teoricamente no se puede hacer lo que dices, aunque aqui te dan una idea de como darle la vuelta.

    http://dba.stackexchange.com/questions/80514/why-does-a-unique-constraint-allow-only-one-null

    Nada de darle la vuelta, es perfecto!!! no sabía que podías hacer ello, ya que el WHERE es parte de la sintaxis según la documentación, no lo sabía, Tú si Enrique!!!!


    martes, 4 de agosto de 2015 22:01
  • Un comportamiento no default es un workaround para mi pero bueno me supongo que tienes razon en ese sentido, esperemos que cubra su necesidad.  
    martes, 4 de agosto de 2015 22:19
  • Hola jeduardonl,

    En base a la sugerencia de Enrique (la de usar un índice filtrado)  que por cierto lo desconocía, hice mis pruebas y te lo comparto, de hecho es la solución para el requerimiento que presentas

    /*Creamos la tabla temporal*/
    create table #Prueba (id int identity(1,1) primary key, fecha date null);
    go
    
    /*Creas un indice unico filtrado, OJO al WHERE*/
    create unique nonclustered index "IX_IUNull" on #Prueba (fecha) where fecha is not null;
    go
    
    /*Inserto valores NULL duplicados*/
    insert into #Prueba values ('01/01/2015'),(Null),('02/01/2015'), (Null),('03/01/2015');
    select * from #Prueba;
    go
    
    /*Sigo insertando valores null*/
    insert into #Prueba values (Null), (Null)
    select * from #Prueba;
    go
    
    /*La siguiente inserción no es permitida porque ya existe la fecha*/
    insert into #Prueba values ('01/01/2015')
    select * from #Prueba;
    go
    
    /*Borramos la tabla temporal, no me gusta esperar :)*/
    drop table #Prueba;
    


    • Marcado como respuesta jeduardonl miércoles, 5 de agosto de 2015 14:50
    martes, 4 de agosto de 2015 22:24
  • Justo lo que necesitaba, muchas gracias
    miércoles, 5 de agosto de 2015 14:50