2011-05-22 17 views
9


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.

Respuesta

9

4 maneras:

  • Filtered index (SQL Server 2008) < - recomendado basado en sus etiquetas
  • gatillo (mencionado)
  • vista indizada (en su pregunta)
  • única restricción/index con la columna calculada (en su pregunta)
+0

Muchas gracias, no sabía sobre el índice filtrado, es exactamente lo que necesito. – a1ex07

2

SQL 2008 le permite definir un filtro i ndex - esencialmente un índice con una cláusula WHERE - vea la respuesta de Phil Haselden al this question para enlaces de MSDN y un ejemplo.

2

Lo normaliza. Mueva la columna a una nueva tabla junto con la clave principal de la tabla actual. Haga que la columna sea única y no nula en la nueva tabla. Las restricciones únicas anulables no tienen sentido lógico y son de poco o ningún uso práctico.

Cuestiones relacionadas