![]() |
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? |
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. |
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. |
Hola,
Cita:
Cita:
Saludos. |
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... |
Hola,
Cita:
Saludos. |
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. |
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. |
La franja horaria es GMT +2. Ahora son las 12:20:51. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi