1.2.10. GUID поля

Тип данных 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 такой трюк не пройдет. Единственный выход – использовать следующую логику:

  • Сгенерировать GUID идентификатор и сохранить его в переменной;
  • Добавить строку с сгенерированным GUID;
  • Найти строку.

Так как мы сами генерировали 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)
)

В этом таблице уже не имеет значения, какого типа первичный ключ. Главное, чтобы тип поля внешнего ключа совпадал с типом первичного основной таблицы.

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне