2013-02-11 10 views
12

Sto aggiornando il mio database per avere una colonna per un GUID per ogni record in una tabella.Genera un nuovo GUID in SQL Server se non ne viene fornito uno

Questa tabella è popolata da diverse fonti diverse e alcune di esse non forniranno un GUID per i nuovi record.

Come posso popolare questa colonna con un newid() sul lato DB solo se non è stato passato alcun valore per un nuovo record?

+2

Impostare il valore predefinito per la colonna come 'NEWID()'? – Kermit

+0

quindi se un valore non esiste, allora NEWID() lo popolerà e non lo sovrascriverà? – Slee

risposta

23

NON RIPETERE NON POSIZIONARE UNA COLONNA DI DEFAULT NEWID(). Se fai il GUID che ottieni sarà completamente casuale e se hai qualche tipo di indicizzazione su questa colonna sarà inutile. Se si intende eseguire questa operazione, impostare la colonna come predefinita per NEWSEQUENTIALID ()

Kimberly Tripp ha uno Great Article e un altro Great Article su questo argomento.

Per implementare NEWSEQUENTIALID () come predefinito:

CREATE TABLE foo 
(unq_id UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID(), 
cola varchar(10)); 

Full SQL Fiddle example..

+1

Sì, questo è meglio, ma si noti che non aiuterà il caso in cui la maggior parte dei GUID provengono dall'app (e chissà come vengono generati). –

+0

Non c'è indicizzazione su questa tabella e non mi interessa se è sequenziale. Alla fine fornirò sempre il valore GUID e questo potrebbe provenire da un sistema diverso in cui è un valore univoco e NON sempre un GUID, quindi ho questo campo come NVARCHAR per renderlo un po 'più flessibile. – Slee

+3

Dire che l'indice è inutile è abbastanza lungo. Avere un indice con problemi di frammentazione è ancora molto migliore per * non * avere un indice necessario. Ma ancora +1 per la soluzione valida. –

5

È possibile impostare il valore predefinito per la colonna su NEWID(). Quindi verrà creato un GUID che verrà assegnato solo se non ne è già stato eseguito uno.

Problemi correlati