Использование данных uniqueidentifier

Тип данных uniqueidentifier содержит 16-байтовые двоичные значения, являющиеся идентификаторами GUID. Идентификатор GUID — это уникальное двоичное число, причем никакие два компьютера во всем мире не создадут два одинаковых значения GUID. Идентификаторы GUID в первую очередь используются для назначения идентификаторов, которые должны быть уникальными в рамках сети, содержащей много компьютеров в различных расположениях.

Значение идентификатора GUID для столбца uniqueidentifier обычно формируется одним из следующих способов.

  • В инструкции Transact-SQL, пакете или сценарии с помощью вызова функции NEWID.

  • В коде приложения путем вызова функции API-интерфейса или метода, возвращающего идентификатор GUID.

Функция Transact-SQL NEWID и функции и методы API, вызываемые приложениями, создают новые значения типа uniqueidentifier, основываясь на идентификационном адресе (MAC-адресе) сетевой платы и уникальном значении счетчика тактового генератора ЦП. У каждой сетевой карты есть уникальный идентификационный номер (MAC-адрес). Значение uniqueidentifier, которое возвращает функция NEWID, формируется с использованием сетевой платы сервера. Значение uniqueidentifier, возвращаемое функциями API и методами предложения, формируется с использованием сетевой платы клиента.

Значение uniqueidentifier обычно не определяется как константа. Константу uniqueidentifier можно задать следующими способами.

  • В символьном формате: '6F9619FF-8B86-D011-B42D-00C04FC964FF'

  • В двоичном формате: 0xff19966f868b11d0b42d00c04fc964ff

Тип данных uniqueidentifier не формирует автоматически новые идентификаторы для вставляемых строк, как это делает свойство IDENTITY. Например, чтобы получить новое значение uniqueidentifier, при создании таблицы необходимо задать предложение DEFAULT, указав функцию NEWID или NEWSEQUENTIALID. В инструкциях INSERT можно также пользоваться функцией 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
ПримечаниеПримечание

Можно воспользоваться для формирования идентификаторов GUID функцией NEWSEQUENTIALID, что позволяет уменьшить конфликты страниц на конечном уровне индексов. Функция NEWSEQUENTIALID может быть использована для столбцов таблицы типа uniqueidentifier только с ограничением DEFAULT.

Столбцы uniqueidentifier могут содержать несколько вхождений какого-либо определенного значения uniqueidentifier, если для них не были дополнительно указаны ограничения UNIQUE или PRIMARY KEY. Столбец внешнего ключа, ссылающийся на первичный ключ типа uniqueidentifier в другой таблице, будет содержать несколько вхождений отдельного значения типа uniqueidentifier, если несколько строк ссылаются на один и тот же первичный ключ в таблице-источнике.

В таблице может быть несколько столбцов uniqueidentifier. Для каждой таблицы можно указать один столбец uniqueidentifier в свойстве ROWGUIDCOL. Свойство ROWGUIDCOL указывает на то, что значения типа uniqueidentifier в столбце уникально идентифицируют строки таблицы. Однако это свойство не гарантирует уникальности. Ее необходимо обеспечивать другими способами, например указав для столбца ограничение PRIMARY KEY. Свойство ROWGUIDCOL используется, в основном, репликацией Microsoft SQL Server. Репликация слиянием и репликация транзакций с обновляемыми подписками пользуются столбцами типа uniqueidentifier для обеспечения уникальной идентификации строк, которые могут находиться в разных копиях одной и той же таблицы.

Тип данных uniqueidentifier имеет несколько недостатков.

  • Значения являются длинными и непонятными. Поэтому пользователям сложно вводить их без ошибок и еще сложнее запоминать.

  • Значения являются случайными, в них нельзя поместить никакие последовательности, которые сделали бы значения более осмысленными для пользователей.

  • Не существует способа определить, в какой последовательности были созданы значения типа uniqueidentifier. Они не приспособлены для использования существующими приложениями, полагающимися на последовательное возрастание ключей в последовательности.

  • Занимая 16 байт, тип данных uniqueidentifier является относительно большим по сравнению с другими типами данных (например с 4-байтовыми целыми). Индексы, построенные на ключах типа uniqueidentifier, могут работать медленнее по сравнению с индексами, где используются ключи типа int.

Если глобальная уникальность не требуется или нужен ключ с последовательно возрастающими значениями, рекомендуется использовать свойство IDENTITY.