2009-07-26 9 views
38

¿Por qué no puedo crear una restricción en una columna nvarchar(max)? SQL Server no me permitirá ponerle una restricción única. Pero, me permite crear una restricción única en una columna nvarchar(100).¿Por qué no puedo poner una restricción en nvarchar (max)?

Ambas columnas son NOT NULL. ¿Hay alguna razón por la que no pueda agregar una restricción a la columna nvarchar(max)?

Respuesta

23

Porque MAX es realmente grande (2 -1 bytes) y podría provocar un colapso del servidor si el servidor tuviera que verificar la exclusividad en entradas de varios megabytes.

De la documentación en Create Index, supongo que esto también se aplica a las limitaciones únicas.

El tamaño máximo permitido de los valores de índice combinados es de 900 bytes.

EDITAR: Si realmente se necesita singularidad, usted podría, potencialmente aproximar calculando un hash de los datos y el almacenamiento de que en un índice único. Incluso un hash grande sería lo suficientemente pequeño como para caber en una columna indexable. Tendría que averiguar cómo manejar las colisiones, tal vez verificar manualmente las colisiones y rellenar los datos (cambiando el hash) si se encuentra una colisión errante.

+0

Para este fin, ¿hay algún valor máximo establecido que el índice puede ser o simplemente "no es MAX"? –

+0

Creo que la longitud máxima de 'nvarchar' y' varchar' está en algún lugar dentro del rango 8000, a menos que use MAX. – Thorarin

+1

El tamaño total máximo de todas las columnas clave de un índice es de 900 bytes. http://msdn.microsoft.com/en-us/library/ms191241.aspx –

4

Una restricción única es en realidad un índice, y nvarchar (max) no se puede utilizar como clave en un índice.

72

nvarchar(max) es realmente un tipo de datos diferente de nvarchar(integer-length). Sus características se parecen más al tipo de datos obsoleto text.

Si nvarchar(max) valor llega a ser demasiado grande, como text, se almacenará fuera la fila (fila está limitada a 8000 bytes como máximo) y un puntero a ella se almacena en la misma fila. No se puede indexar de manera eficiente un campo tan grande y el hecho de que los datos se pueden almacenar en otro lugar complica aún más la búsqueda y el escaneo del índice.
Una restricción única requiere que se aplique un índice y, como resultado, los diseñadores de SQL Server decidieron no permitir la creación de una restricción única en él.

+5

Por supuesto, podrían haber usado una versión de CRC o MD5 para hacer que la restricción sea barata de verificar con una probabilidad excesivamente alta. En todo caso; no lo hicieron ... –

+0

Gracias por la explicación, ¡has ayudado a explicar esto mejor que yo! –

Cuestiones relacionadas