Restricciones únicas en columnas anulables en SQL Server 2005


12

En este proyecto en el que estoy trabajando, necesito establecer un campo particular para que sea único (¡no es un problema!), Pero si el campo es nulo, quiero que se ignore la restricción. En SQL Server 2008, uso el índice filtrado como se muestra a continuación, ¡pero esto no está disponible en versiones anteriores de SQL!

CREATE UNIQUE NONCLUSTERED INDEX User_UserName_IUC
ON [User] (pinNr)
WHERE UserName IS NOT NULL

Pero no creo que esté disponible en SQL Server 2005. De hecho, esta publicación de blog indica que hay una solución alternativa usando un disparador para verificar la unicidad. ¿Alguien tiene un ejemplo de esto? o tal vez una alternativa?

¡Desafortunadamente, actualizar a SQl Server 2008 no es una opción para este cliente en particular!

Respuestas:


18

En realidad, tuve que hacer algo como esto una vez. Implicaba crear una columna calculada que tomara el valor de la columna Única cuando no es así NULLy el valor de la clave primaria (con alguna otra lógica para que sea imposible chocar con los valores de la columna única), y hacer que el índice único esté activado esa columna Puede ver un ejemplo de esto y el método de activación aquí .


7

Puede hacer una vista (donde el nombre de usuario no es nulo) y luego colocar un índice único en la vista. Nunca necesitará usar la vista, solo existirá para esto.

También puede usar esta técnica para imponer la unicidad en varias tablas, donde normalmente sería imposible.


2
Las vistas indizadas no requieren edición empresarial. Sin embargo, requieren que use la sugerencia de consulta WITH (NOEXPAND) para obligar al optimizador de consultas de edición estándar a usar la vista indizada en lugar de la consulta subyacente.
Jeremiah Peschka

3
En este caso, aunque el único punto de vista es hacer cumplir la restricción única y este es un enfoque perfectamente válido / común.
Martin Smith

2
Editado para eliminar información incorrecta sobre la edición Enterprise requerida.
Meff

@Meff, gracias por tomarse el tiempo para responder a los comentarios aquí. Espero que no seas un extraño en el sitio: es posible que te interesen estas preguntas :)
Jack dice que intente topanswers.xyz el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.