2010-05-21 28 views
5

Excepción:Violación de restricción UNIQUE KEY nula

Violation of UNIQUE KEY constraint 'UQ__user_dat__AB6E61641273C1CD'. Cannot insert duplicate key in object 'dbo.user_data'. 
The statement has been terminated. 

AB6E61641273C1CD = correo electrónico que es único y NULL

Mi instrucción SQL no se inserta un valor para el correo electrónico. Así que supongo que tendrá el valor predeterminado como nulo (aunque nunca escribí una declaración predeterminada (nula) al crear la tabla).

¿Cuál es el problema? El código funcionó perfectamente en sqlite.

+0

SQL Server 2008? 2005? – gbn

+0

usaré sql 08 muy probablemente –

Respuesta

5

Si desea una clave única que ignora valores nulos que no es posible en SQL Server. Sin embargo this article describe cómo se puede conseguir que el comportamiento través

  • Un indexados - vista con una cláusula where que elimina los nulos
  • columna calculada - restricción es sobre una declaración de caso que convierte los valores nulos en el PK
  • un disparador - el gatillo no era una restricción única hace pero hace caso omiso de los nulos
  • normalización - poner los datos en otra mesa donde una fila no existe para valores nulos

Además, AlexKuznestov's cuenta que en SQL 2008 puede proporcionar un índice filtrado.

El mejor de ellos es una vista indizada pero como un disparador de su existencia no siempre es evidente. La columna calculada es interesante, pero necesitaría poder garantizar que los datos reales nunca entren en conflicto con la columna en la que está "encajonado".

1

una restricción única sólo permite 1 valor nulo en SQL Server, Oracle, por ejemplo, permite que muchos NULLS

ejemplo

create table test (id int) 


CREATE UNIQUE NONCLUSTERED INDEX [IX_test] ON [dbo].[test] 


insert test values(NULL) 

--will fail 
insert test values(NULL) 

Msg 2601, nivel 14, estado 1, línea 1 No se puede insertar clave duplicada fila en el objeto 'dbo.test' con el índice único 'IX_test'. La declaración ha finalizado.

+1

WTF! Entonces ... ¡WTF! ¿Qué puedo hacer como solución alternativa?No se usa único!?! a pesar de que necesito (es decir, hacer cumplir a mano) –

0

Es probable que ya tienen una fila con nulo en la columna de correo electrónico.

1

SQL amenaza es 100% correcto si se pone una clave única en una columna, pero permite nulos Sólo se permite un nulo en esa columna para todas las filas de la tabla.

Ejemplo:

Column with unique key 
1 
2 
3 
NULL 
4 

Para mantener la columna única que puedo entrar en cualquier cosa menos 1,2,3,4, o NULL

+0

esto está permitido en otras bases de datos ... ver comentario en la publicación SQL Menace. –

+0

sí lo es, pero dado que la publicación fue etiquetada con SQL-Server, supuse que quería una explicación de cómo SQL-Server maneja las TECLAS ÚNICAS –

5

En SQL Server 2008 puede utilizar un índice filtrado en su lugar. SQL Server 2005, use una vista indexada.

+0

+1, lo que iba a sugerir –

+0

+1 acaba de probar el índice filtrado, funciona bien . Bonito. –

7

Si está ejecutando SQL Server 2008 se puede utilizar un índice filtrado como se sugiere here.

create unique nonclustered index idx on dbo.DimCustomer(emailAddress) 
where EmailAddress is not null; 
Cuestiones relacionadas