2009-07-26 17 views
38

Perché non riesco a creare un vincolo su una colonna nvarchar(max)? SQL Server non mi consentirà di inserire un vincolo univoco su di esso. Ma, mi consente di creare un vincolo univoco su una colonna nvarchar(100).Perché non riesco a mettere un vincolo su nvarchar (max)?

Entrambe queste colonne sono NOT NULL. C'è qualche ragione per cui non riesco ad aggiungere un vincolo alla colonna ?

risposta

23

Poiché MAX è veramente grande (2 -1 byte) e potrebbe portare a un crollo del server se il server ha dovuto verificare l'univocità su voci di dimensioni multi-megabyte.

Dalla documentazione su Create Index, suppongo che ciò valga anche per i vincoli univoci.

La dimensione massima consentita dei valori dell'indice combinato è di 900 byte.

EDIT: Se davvero bisogno di unicità, si potrebbe, potenzialmente approssimarla calcolando un hash dei dati e l'archiviazione che in un indice univoco. Anche un grosso hash sarebbe abbastanza piccolo da stare in una colonna indicizzabile. Dovresti capire come gestire le collisioni - forse controllare manualmente le collisioni e tamponare i dati (cambiando l'hash) se viene trovata una collisione errata.

+0

A tal fine, c'è qualche valore massimo impostato che l'indice può essere, o è solo 'non MAX'? –

+0

Penso che la lunghezza massima di 'nvarchar' e' varchar' sia da qualche parte nell'intervallo 8000, a meno che non si usi MAX. – Thorarin

+1

La dimensione totale massima di tutte le colonne chiave di un indice è 900 byte. http://msdn.microsoft.com/en-us/library/ms191241.aspx –

4

Un vincolo univoco è in realtà un indice e nvarchar (max) non può essere utilizzato come chiave in un indice.

72

nvarchar(max) è in realtà un tipo di dati diverso da nvarchar(integer-length). Le sue caratteristiche sono più simili al deprecato tipo di dati text.

Se nvarchar(max) valore diventa troppo grande, come text, verrà memorizzato fuori riga (una riga è vincolato a 8000 byte massimo) e un puntatore ad esso viene memorizzato nella stessa fila. Non è possibile indicizzare in modo efficiente un campo così ampio e il fatto che i dati possano essere memorizzati altrove può complicare ulteriormente la ricerca e la scansione dell'indice.
Un vincolo univoco richiede l'applicazione di un indice e, di conseguenza, i progettisti di SQL Server hanno deciso di non consentire la creazione di un vincolo univoco su di esso.

+5

Ovviamente, avrebbero potuto usare una versione di CRC o MD5 per rendere il vincolo economico da verificare con una probabilità eccessivamente alta. In ogni caso; non hanno ... –

+0

Grazie per la spiegazione, hai aiutato a spiegare meglio di quanto posso! –

Problemi correlati