PDA

Ver la Versión Completa : Constraint Unica


lafirma
09-08-2003, 00:21:44
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?

kinobi
09-08-2003, 00:52:14
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.

Iván
13-08-2003, 08:57:31
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.

kinobi
13-08-2003, 09:32:53
Hola,

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.

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.

Carlitos
13-08-2003, 12:05:55
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...

kinobi
13-08-2003, 12:49:53
Hola,

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.

Iván
13-08-2003, 13:29:24
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.

Carlitos
14-08-2003, 13:29:46
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.