2009-02-19 11 views
49

Ho una tabella con una chiave primaria, ma voglio che altre due colonne siano vincolate in modo che la combinazione dei due sia sempre univoca.Qual è la differenza tra Chiave univoca e Indice con IsUnique = Sì?

(un esempio stupido:. In una tabella LIBRI, la colonna IBAN è la chiave primaria, ma la combinazione del titolo e colonne autore dovrebbe anche essere sempre unico)

In SQL Server Management Studio è possibile creare un nuovo indice e impostare IsUnique su Sì oppure creare una nuova chiave univoca.

Qual è la differenza tra i due approcci e quale si adatta meglio per quali scopi?

+5

Nel caso in cui sia rilevante: se è necessario consentire a più righe di essere NULL ma qualsiasi riga non NULL deve essere UNICA: o applicarla con Trigger o VISUALIZZA con un INDICE UNICO - CREATE VIEW xxx AS SELECT Title, Autore DA Libri DOVE (Titolo + Autore) NON È NULL quindi crea un indice su quella Vista – Kristen

+0

Grazie Kirsten, questa era un'informazione utile! – JacobE

+1

Vedi anche http://stackoverflow.com/questions/366186/is-the-sql-server-unique-key-also-an-index –

risposta

35

La creazione di un vincolo UNIQUE è una dichiarazione più chiara della regola. L'attributo IsUnique dell'indice è un dettaglio di implementazione - in cui è implementata la regola, non la regola è. L'effetto è lo stesso però.

+0

che cosa riguarda le prestazioni? – pylover

+1

@pylover: in alcuni casi un vincolo (ad esempio una chiave esterna o non nulla) può migliorare le prestazioni fornendo all'ottimizzatore informazioni utili che altrimenti non avrebbe. Nel caso dell'unicità, immagino che non ci sia differenza tra un vincolo e solo un indice, ma non sicuro al 100%. –

0

gli indici univoci sono chiavi univoche.

6

solo in modo che si sa, quando si crea un unico vincolo di SQL Server creerà un indice dietro le quinte

7

V'è una netta differenza tra il 2. un vincolo univoco definisce quale combinazione di colonne deve essere unico. Un indice univoco è solo un modo per assicurarsi che quanto sopra sia sempre valido. Ma è possibile avere un indice non univoco che supporta un vincolo univoco. (se il vincolo è deferibile = deve essere valido solo al momento del commit ma può essere interrotto nel mezzo di una transazione)

4

Una cosa che ho appena scoperto è che nello scripting SSMS di chiavi univoche era impostato su true per impostazione predefinita, ma lo scripting degli indici era impostato su False. Quando ho usato la Tabella degli script come menu di scelta rapida da SSMS non ho ottenuto i miei indici univoci.

Anche se il tipo è impostato su Chiave univoca, non è possibile modificare l'impostazione "Ignora chiave duplicata". Innanzitutto è necessario modificare il tipo da Chiave univoca a indice, quindi è possibile impostare Ignora chiavi duplicate su true.

Problemi correlati