Usar datos uniqueidentifier

El tipo de datos uniqueidentifier almacena valores binarios de 16 bytes que funcionan como identificadores exclusivos globales (GUID). Un GUID es un número binario exclusivo; ningún otro equipo del mundo generará un duplicado de ese GUID. El principal uso de un GUID se da cuando se asigna un identificador que debe ser exclusivo en una red que tiene muchos equipos en distintos emplazamientos.

El valor GUID de una columna uniqueidentifier suele obtenerse de una de las siguientes formas:

  • En una instrucción, lote o script de Transact-SQL al llamar a la función NEWID.

  • En el código de la aplicación al llamar a una función o método de la API de la aplicación que devuelva un GUID.

La función NEWID de Transact-SQL y las funciones y métodos de la API de la aplicación generan nuevos valores uniqueidentifier a partir del número de identificación de su tarjeta de red más un número exclusivo del reloj de la CPU. Cada tarjeta de red tiene un número de identificación exclusivo. El valor uniqueidentifier devuelto por NEWID se genera con la tarjeta de red del servidor. El valor uniqueidentifier devuelto por las funciones y métodos de la API de la aplicación se genera con la tarjeta de red del cliente.

Un valor uniqueidentifier no suele definirse como una constante. Puede especificar una constante uniqueidentifier de las siguientes maneras:

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

  • Formato binario: 0xff19966f868b11d0b42d00c04fc964ff

El tipo de datos uniqueidentifier no genera automáticamente nuevos identificadores para las filas insertadas como lo hace la propiedad IDENTITY. Por ejemplo, para obtener nuevos valores uniqueidentifier, una tabla debe tener una cláusula DEFAULT que especifique la función NEWID o NEWSEQUENTIALID, o bien las instrucciones INSERT deben usar la función 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

NEWSEQUENTIALID() se puede utilizar para generar GUID a fin de reducir la contención de páginas de nivel hoja en los índices. NEWSEQUENTIALID sólo se puede usar con restricciones DEFAULT en columnas de tabla de tipo uniqueidentifier.

En las columnas uniqueidentifier un valor individual uniqueidentifier puede aparecer varias veces, a menos que se especifiquen también para la columna las restricciones UNIQUE o PRIMARY KEY. Una columna de clave externa que haga referencia a una clave principal uniqueidentifier de otra tabla tendrá varias repeticiones de valores individuales uniqueidentifier cuando haya varias filas que hagan referencia a la misma clave principal de la tabla de origen.

Una tabla puede tener varias columnas uniqueidentifier. Con la propiedad ROWGUIDCOL se puede especificar una columna uniqueidentifier para cada tabla. La propiedad ROWGUIDCOL indica que los valores uniqueidentifier de la columna identifican de forma exclusiva a las filas de la tabla. No obstante, la propiedad no hace nada para exigir esto. La exclusividad debe exigirse a través de otros mecanismos, por ejemplo especificando la restricción PRIMARY KEY para la columna. La propiedad ROWGUIDCOL es utilizada, fundamentalmente, por la replicación de Microsoft SQL Server. La replicación de mezcla y la replicación transaccional con suscripciones de actualización utilizan columnas uniqueidentifier a fin de garantizar que las filas se identifiquen de forma única en distintas copias de la tabla.

El tipo de datos uniqueidentifier tiene varias desventajas:

  • Los valores son largos y poco claros. Esto hace que sea difícil para los usuarios escribirlos correctamente y recordarlos.

  • Los valores son aleatorios y no podrían aceptar ningún patrón que hiciera que tuvieran más sentido para los usuarios.

  • No hay forma de determinar la secuencia en la que se generaron los valores uniqueidentifier. No son adecuados para las aplicaciones existentes que dependen de que los valores de clave aumenten en serie.

  • Con 16 bytes, el tipo de datos uniqueidentifier es relativamente mayor que otros tipos de datos, por ejemplo los enteros de 4 bytes. Esto supone que los índices generados con claves uniqueidentifier pueden ser relativamente más lentos que si se utiliza una clave int.

Considere la posibilidad de utilizar la propiedad IDENTITY cuando no sea necesaria la exclusividad global o cuando se prefiera disponer de una clave que aumente secuencialmente.