Использование данных uniqueidentifier
Изменения: 14 апреля 2006 г.
Тип данных 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 2005. Репликация слиянием и репликация транзакций с обновляемыми подписками пользуются столбцами типа uniqueidentifier для обеспечения уникальной идентификации строк, которые могут находиться в разных копиях одной и той же таблицы.
Тип данных uniqueidentifier имеет несколько недостатков.
- Значения являются длинными и непонятными. Поэтому пользователям сложно вводить их без ошибок и еще сложнее запоминать.
- Значения являются случайными, в них нельзя поместить никакие последовательности, которые сделали бы значения более осмысленными для пользователей.
- Не существует способа определить, в какой последовательности были созданы значения типа uniqueidentifier. Они не приспособлены для использования существующими приложениями, полагающимися на последовательное возрастание ключей в последовательности.
- Занимая 16 байт, тип данных uniqueidentifier является относительно большим по сравнению с другими типами данных (например, с 4-байтовыми целыми). Индексы, построенные на ключах типа uniqueidentifier, могут работать медленнее по сравнению с индексами, где используются ключи типа int.
Если глобальная уникальность не требуется или нужен ключ с последовательно возрастающими значениями, рекомендуется использовать свойство IDENTITY.
См. также
Другие ресурсы
Типы данных (Transact-SQL)
NEWID (Transact-SQL)
NEWSEQUENTIALID()
Обзор репликации слиянием
uniqueidentifier (Transact-SQL)
Обновляемые подписки для репликации транзакций
Справка и поддержка
Получение помощи по SQL Server 2005
Журнал изменений
Версия | Журнал |
---|---|
14 апреля 2006 г. |
|