Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-08-2003
lafirma lafirma is offline
Miembro
 
Registrado: may 2003
Ubicación: Honduras
Posts: 159
Poder: 22
lafirma Va por buen camino
Constraint Unica

Quiero que los valores de una columna sean unicos, o sea que no se repitan, para eso hago un contraint unique sobre esa columna, pero tengo un problema, en ocasiones dicha columna no tiene valor, o sea que es null, y el constraint no me pèmite hacer eso
como puedo lograr que los valors de esa columna no se repitan pero que ademas me permita valores nulos?
__________________
Saludos

Douglas Cruz
Responder Con Cita
  #2  
Antiguo 09-08-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 24
kinobi Va por buen camino
Hola,

depende de la versión de InterBase/Firebird que estés utilizando. InterBase (al menos las versiones 6.x y anteriores) y Firebird 1.0.x no lo soportan (columnas con restricción UNIQUE deben ser también NOT NULL).

Firebird 1.5 sí soporta columnas UNIQUE con posibilidad de valores nulos.

Una posible solución (si no puedes migrar a Firebird 1.5) es el uso de triggers (BEFORE <acción>). En el trigger compruebas, con una SELECT COUNT(<campo>) ... WHERE <campo> = <NEW.campo>, si ya existe el valor (la SELECT anterior debe dar un valor mayor que cero); evidentemente sólo es necesaria la comprobación en el caso que no estés introducciendo o actualizando un valor NULL. En caso de que ya exista el valor, lanzas una excepción.

Saludos.

Última edición por kinobi fecha: 09-08-2003 a las 00:55:14.
Responder Con Cita
  #3  
Antiguo 13-08-2003
Iván Iván is offline
Miembro
 
Registrado: may 2003
Ubicación: Palma de Mallorca
Posts: 118
Poder: 21
Iván Va por buen camino
Acabo de leer este mensaje, y la verdad es q me he preocupado un poco.

Veamos, si me explico bien. Para mi que en un campo/s definidos como únicos se pueda poner valores NULLs no es correcto, ya que si dos registros tienen valor null, entonces está repetido dicho valor, y se rompe el criterio de uniciadad de ese campo.

Aunque podría parecer algo muy teórico y bonito, durante bastante tiempo mucha gente ha usado campos con la restricción de UNIQUE emulando a las claves primarias.

Esto tenía mucho sentido, sobretodo, si definiamos un generador como clave primaria, pero luego también quería tener, por ejemplo la fecha y número de la factura (ambos dos) como clave primaria. Al sólo poder tener una única clave primaria, pues hacíamos a la fecha y número de factura una restricción como UNIQUE, con lo que nos asegurabamos que también que dos registros no podrían tener a la vez los mismos valores.

La verdad es q con este cambio en FB1.5, bastante gente tendrá que revisar bastante código.

Un saludo.
__________________
Di amigo, y entra...
Guía de estilos de los foros

Visita www.mundobd.com
Responder Con Cita
  #4  
Antiguo 13-08-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 24
kinobi Va por buen camino
Hola,

Cita:
Posteado originalmente por Iván
Veamos, si me explico bien. Para mi que en un campo/s definidos como únicos se pueda poner valores NULLs no es correcto, ya que si dos registros tienen valor null, entonces está repetido dicho valor, y se rompe el criterio de uniciadad de ese campo.
en parte, en gran parte, estoy de acuerdo con tu argumento, aunque, por extraño que parezca, el SQL-99 admite la posibilidad de columnas UNIQUE con valores nulos.

Cita:
Posteado originalmente por Iván
La verdad es q con este cambio en FB1.5, bastante gente tendrá que revisar bastante código.
en realidad el problema, como lo refleja el documento de notas de la versión, está si subimos una base de datos 1.0.x a 1.5, suponiendo una(s) columna(s) UNIQUE sin NOT NULL en la que introducimos valores nulos, y posteriormente volvemos a la versión 1.0.x. Se rompe la compatibilidad hacia atrás.

Saludos.

Última edición por kinobi fecha: 13-08-2003 a las 09:37:25.
Responder Con Cita
  #5  
Antiguo 13-08-2003
Carlitos Carlitos is offline
Miembro
 
Registrado: ago 2003
Posts: 22
Poder: 0
Carlitos Va por buen camino
La verdad es que la pregunta es un dilema. Si es único, está claro que si el campo es null y sólo existe un registro con dicho valor, es un valor único y debería ser válido, pero no tendría sentido tener varios campos con null y pedir que sea único... no se cumpliríala regla de unicidad...

En todo caso debería ser una regla especial UNIQUE NOT NULL o algo similar para situaciones como la que dices, si realmente tiene sentido o utilidad. Si FireBird 1.5 lo tiene será porque es útil, pero espero que sea no con el UNIQUE sino con otra opción especial...
Responder Con Cita
  #6  
Antiguo 13-08-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 24
kinobi Va por buen camino
Hola,

Cita:
Posteado originalmente por Carlitos
no se cumpliríala regla de unicidad...
imagino, es sólo una suposición, que lo que hace es no hacer cumplir la regla de integridad para los valores nulos o, como alternativa, asumir que un valor nulo es un valor indeterminado y que, por tanto, no existen dos valores NULL iguales (dentro del contexto de la regla de integridad, unicidad en este caso).

Saludos.
Responder Con Cita
  #7  
Antiguo 13-08-2003
Iván Iván is offline
Miembro
 
Registrado: may 2003
Ubicación: Palma de Mallorca
Posts: 118
Poder: 21
Iván Va por buen camino
Para mi el problema es más filosófico que otra cosa.

Ya que por definición el NULL no es un valor... Es algo indefinido... Y hay gente que defiende que no debería estar dentro de las restricciones de unicidad... etc.... Por eso, una clave primaria no permite nulos.

Ahora bien, yo al menos siempre que he definido campos con indices únicos, también he definidos las columnas como NOT NULL, con lo que no tendré ese problema...

Pero preferiría que la BD controlará el tema de la UNICIDAD sin NULLs, ya que a mi como persona humana se me puede escapar uno sin querer.

Un saludo.
__________________
Di amigo, y entra...
Guía de estilos de los foros

Visita www.mundobd.com
Responder Con Cita
  #8  
Antiguo 14-08-2003
Carlitos Carlitos is offline
Miembro
 
Registrado: ago 2003
Posts: 22
Poder: 0
Carlitos Va por buen camino
En buena hora se me ocurrió cuestionar sobre el UNIQUE sobre campos NULL y su necesidad... Esta mañana me ha echo falta...

Está claro que puede ser (es...) muy útil poder indicar que el UNIQUE no tenga que ser NOT NULL. En mi caso efectivamente necesito comprobar la restricción de UNIQUE para que no existan repetidos, pero los nulos no los considere o controle.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 13:47:42.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi