Utilizzo del tipo di dati uniqueidentifier

Il tipo di dati uniqueidentifier consente di archiviare valori binari a 16 byte che fungono da identificatori univoci globali (GUID). Un valore GUID è un numero binario univoco, ovvero non generato in nessun altro computer a livello mondiale, utilizzato principalmente per l'assegnazione di un identificatore univoco in reti a cui sono collegati più computer in posizioni diverse.

In genere è possibile ottenere un valore GUID per una colonna uniqueidentifier in uno dei modi seguenti:

  • In un'istruzione, in un batch o in uno script Transact-SQL tramite la funzione NEWID.

  • Nel codice di un'applicazione tramite la funzione o il metodo API che restituisce un valore GUID.

La funzione NEWID di Transact-SQL e le funzioni o i metodi API dell'applicazione generano nuovi valori uniqueidentifier a partire dal numero di identificazione della scheda di rete e dal numero univoco del clock della CPU. A ogni scheda di rete è associato un numero di identificazione univoco. Il valore uniqueidentifier restituito da NEWID viene generato in base all'ID della scheda di rete del server, mentre il valore uniqueidentifier restituito dalle funzioni e dai metodi API dell'applicazione viene generato in base all'ID della scheda di rete del client.

Un valore uniqueidentifier in genere non viene definito come una costante. È possibile specificare una costante uniqueidentifier nei modi seguenti:

  • Formato stringa di caratteri: '6F9619FF-8B86-D011-B42D-00C04FC964FF'

  • Formato binario: 0xff19966f868b11d0b42d00c04fc964ff

A differenza della proprietà IDENTITY, il tipo di dati uniqueidentifier non genera automaticamente nuovi ID per le righe aggiunte. Ad esempio, per ottenere nuovi valori uniqueidentifier, è necessario che nella tabella sia inclusa la clausola DEFAULT che specifica la funzione NEWID o NEWSEQUENTIALID, oppure le istruzioni INSERT devono utilizzare la funzione NEWID.

CREATE TABLE MyUniqueTable
   (UniqueColumn   UNIQUEIDENTIFIER      DEFAULT NEWID(),
   Characters      VARCHAR(10) )
GO
INSERT INTO MyUniqueTable(Characters) VALUES ('abc')
INSERT INTO MyUniqueTable VALUES (NEWID(), 'def')
GO

[!NOTA]

È possibile utilizzare NEWSEQUENTIALID per generare GUID in modo da limitare i problemi di contesa delle pagine al livello foglia degli indici. La funzione NEWSEQUENTIALID può essere utilizzata solo con vincoli DEFAULT su colonne di tabella di tipo uniqueidentifier.

Le colonne di tipo uniqueidentifier possono includere più occorrenze di uno stesso valore uniqueidentifier, a meno che per la colonna non siano stati specificati anche vincoli UNIQUE o PRIMARY KEY. Una colonna chiave esterna che fa riferimento a una chiave primaria di tipo uniqueidentifier di un'altra tabella contiene più occorrenze di uno stesso valore uniqueidentifier quando più righe fanno riferimento alla stessa chiave primaria della tabella di origine.

Una tabella può includere più colonne di tipo uniqueidentifier. È possibile specificare una colonna di tipo uniqueidentifier per ogni tabella tramite la proprietà ROWGUIDCOL. La proprietà ROWGUIDCOL indica che i valori uniqueidentifier della colonna identificano in modo univoco le righe della tabella. Non garantisce tuttavia l'univocità dei valori, che deve essere implementata mediante altri meccanismi, ad esempio specificando il vincolo PRIMARY KEY per la colonna. La proprietà ROWGUIDCOL viene utilizzata principalmente nelle funzioni di replica di MicrosoftSQL Server. La replica di tipo merge e la replica transazionale con aggiornamento delle sottoscrizioni utilizzano le colonne di tipo uniqueidentifier per identificare in modo univoco le righe in più copie della tabella.

Il tipo di dati uniqueidentifier presenta tuttavia gli svantaggi seguenti:

  • I valori sono lunghi e complessi. Per gli utenti risulta pertanto difficile digitarli correttamente e soprattutto ricordarli.

  • I valori sono casuali e non accettano schemi che potrebbero renderli più significativi per l'utente.

  • Non esiste alcun modo per determinare la sequenza con cui vengono generati i valori uniqueidentifier. I valori di questo tipo non sono adatti alle applicazioni esistenti che dipendono da valori chiave con incremento seriale.

  • Le dimensioni massime di 16 byte previste per il tipo di dati uniqueidentifier sono relativamente più grandi rispetto ad altri tipi di dati, ad esempio i numeri interi a 4 byte. Ciò significa che gli indici creati con chiavi di tipo uniqueidentifier possono essere relativamente più lenti rispetto agli indici che utilizzano una chiave di tipo int.

Quando l'univocità a livello globale non è un requisito necessario oppure è preferibile disporre di una chiave con incremento seriale, è consigliabile utilizzare la proprietà IDENTITY.