Usando dados uniqueidentifier

O tipo de dados uniqueidentifier armazena valores binários de 16 bytes que operam como GUIDs (Globally Unique Identifiers). Um GUID é um número binário exclusivo; nenhum outro computador no mundo gerará uma duplicata daquele valor GUID. O principal uso de um GUID é atribuir um indicador que deve ser idêntico em uma rede com vários computadores em muitos sites.

O valor GUID de uma coluna uniqueidentifier é obtido, normalmente, das seguintes formas:

  • Em uma instrução Transact-SQL, lote ou script, chamando a função NEWID.

  • Em código de aplicativo, chamando uma função API de aplicativo ou um método que retorne um GUID.

A função Transact-SQL NEWID, as funções API de aplicativo e os métodos geram novos valores uniqueidentifier do número de identificação do cartão de rede, além do número exclusivo do clock da CPU. Cada cartão de rede tem um número de identificação exclusivo. O valor uniqueidentifier que é retornado por NEWID é gerado usando o cartão de rede no servidor. O valor uniqueidentifier retornado pelas funções API do aplicativo e pelos métodos são gerados usando o cartão de rede no cliente.

Um valor uniqueidentifier não é definido geralmente como uma constante. Você pode especificar uma constante uniqueidentifier das seguintes maneiras:

  • Formato de cadeia de caracteres: '6F9619FF-8B86-D011-B42D-00C04FC964FF'

  • Formato binário: 0xff19966f868b11d0b42d00c04fc964ff

O tipo de dados uniqueidentifier não gera automaticamente as novas ID das linhas inseridas da mesma forma que a propriedade IDENTITY faz. Por exemplo, para obter novos valores uniqueidentifier, a tabela precisa ter uma cláusula DEFAULT, que especifica a função NEWID ou NEWSEQUENTIALID. Ou as instruções INSERT devem usar a função 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
ObservaçãoObservação

Você pode usar NEWSEQUENTIALID para gerar GUIDs e reduzir a contenção da página no nível folha de índices. NEWSEQUENTIALID só pode ser usada com restrições DEFAULT em colunas de tabela do tipo uniqueidentifier.

As colunas uniqueidentifier podem conter várias ocorrências de um valor uniqueidentifier individual, a menos que também sejam especificadas as restrições UNIQUE ou PRIMARY KEY da coluna. Uma coluna de chave estrangeira que faz referência à chave primária uniqueidentifier em outra tabela conterá várias ocorrências de valores uniqueidentifier individuais quando várias linhas fizerem referência à mesma chave primária na tabela de origem.

Uma tabela pode ter várias colunas uniqueidentifier. Uma coluna uniqueidentifier pode ser especificada para todas as tabelas com a propriedade ROWGUIDCOL. A propriedade ROWGUIDCOL indica que os valores uniqueidentifier da coluna identificam exclusivamente as linhas da tabela. Contudo, a propriedade não faz nada para impor isso. A exclusividade deve ser forçada por meio de outros mecanismos, como especificar a restrição PRIMARY KEY para a coluna. A propriedade ROWGUIDCOL é usada principalmente usada pela replicação Microsoft SQL Server. Replicações de mesclagem e transacional, que têm assinaturas atualizadas, usam colunas uniqueidentifier para garantir que as linhas sejam identificadas com exclusividade em várias cópias da tabela.

O tipo de dados uniqueidentifier tem as seguintes desvantagens:

  • Os valores são longos e obscuros. Isso dificulta a digitação correta dos valores por parte dos usuários. Além disso, torna-se difícil recordá-los.

  • Os valores são aleatórios e não podem aceitar nenhum padrão que os torne mais significativos para os usuários.

  • Não há nenhuma forma de determinar a seqüência na qual os valores uniqueidentifier foram gerados. Não são apropriados para os aplicativos já existentes que dependem do incremento dos valores de chave em série.

  • A 16 bytes, o tipo de dados uniqueidentifier é relativamente maior do que outros tipos de dados, como inteiros de 4 bytes. Isso significa que os índices criados usando chaves uniqueidentifier podem ser relativamente mais lentos do que índices que usam uma chave int.

Considere o uso da propriedade IDENTITY quando a exclusividade global não for necessária, ou quando for preferível ter uma chave com incrementos em série.