Тип данных uniqueidentifier (уникальный идентификатор) и функция NEWID – это две возможности, которые используются вместе. Используйте эти возможности, когда данные сопоставляются из нескольких таблиц в одну большую таблице, когда нужно обеспечить уникальность всех записей. Поле типа uniqueidentifier гарантирует уникальность и разработчики рекомендуют использовать именно этот тип для первичного ключа.
Тип данных uniqueidentifier хранит число уникального идентификатора в виде 16-байт бинарной строки. Тип данных использует для хранения глобальный уникальный идентификатор (GUID). Функция NEWID создает новое число уникального идентификатора, которое хранится в поле с типом данных uniqueidentifier.
Тип данных uniqueidentifier не генерирует автоматически новый ID для вставляемой строки в отличие от свойства Identity, его нужно генерировать самостоятельно с помощью функции NEWID. Но если сделать функцию NEWID в качестве значения по умолчанию, то работа поля uniqueidentifier будет идентична Identity:
CREATE TABLE TestTable ( guid uniqueidentifier DEFAULT NEWID(), vcFirstName varchar(50), vcLastName varchar(50), )
Но у таблиц с первичным ключом uniqueidentifier есть один большой недостаток – нельзя определить, какое поле было добавлено последним, если GUID генерируется сервером. При первичном ключе Identity после добавления строки, чтобы найти новую запись нужно найти строку с максимальным первичным ключом. С uniqueidentifier такой трюк не пройдет. Единственный выход – использовать следующую логику:
Так как мы сами генерировали GIUD значение, то без проблем сможем после добавления записи найти соответствующую строку в базе данных. О работе с GUID полями мы еще поговорим в главе 2.24. Сейчас же нас интересует создание таблиц с уникальными идентификаторами.
Давайте посмотрим, как можно создать связанную таблицу. Следующий пример создает главную таблицу, у которой поле "idName" является первичным ключом и имеет тип uniqueidentifier:
CREATE TABLE Names ( idName uniqueidentifier DEFAULT NEWID(), vcName varchar(50), CONSTRAINT PK_guid PRIMARY KEY (idName), )
Теперь, чтобы создать связанную таблицу, необходимо чтобы поле внешнего ключа также имело тип uniqueidentifier:
CREATE TABLE Phones ( idPhone uniqueidentifier DEFAULT NEWID(), idName uniqueidentifier, vcPhone varchar(10), CONSTRAINT PK_idPhone PRIMARY KEY (idPhone), CONSTRAINT FK_idName FOREIGN KEY (idName) REFERENCES Names (idName) )
В этом таблице уже не имеет значения, какого типа первичный ключ. Главное, чтобы тип поля внешнего ключа совпадал с типом первичного основной таблицы.