Necesito 1 columna en la tabla para contener valores únicos no nulos o NULL
. La restricción TSQL UNIQUE
trata a 2 NULL
como iguales, por lo que no puedo hacer que la columna sea única.
¿Cuál es la forma correcta de manejar este problema?
Después de investigar un poco, encontré 2 métodos que me parecen correctos, pero no puedo determinar cuál es mejor.
La primera, que no se aplica a todos los casos:La forma correcta de implementar una restricción única que permite valores NULL múltiples en SQL Server
CREATE TABLE test (id INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
null_or_unique_id INT, unique_key AS
(CASE WHEN [null_or_unique_id] IS NULL THEN -(1)*[id]
ELSE [null_or_unique_id] END), UNIQUE(unique_key));
Funciona, pero requiere que todos los valores permitidos de null_or_unique_id
a ser no negativo (eso está bien en mi caso)
La segunda:
CREATE VIEW test_view WITH SCHEMABINDING AS
SELECT [null_or_unique_id] FROM dbo.test WHERE [null_or_unique_id] IS NOT NULL;
GO
CREATE UNIQUE CLUSTERED INDEX byNullOrUniqueId
ON dbo.test_view([null_or_unique_id]);
Seguramente, también es posible implementar la funcionalidad deseada con desencadenadores, pero creo que la solución desencadenante generará más sobrecarga que cualquiera de los mencionados anteriormente.
¿Cuál es la mejor práctica para este tipo de caso?
Gracias por sus respuestas.
Muchas gracias, no sabía sobre el índice filtrado, es exactamente lo que necesito. – a1ex07