Получение последнего вставленного GUID в SQL Server

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для получения GUID (UNIQUEIDENTIFIER) сразу посle insert-операции используйте ключевое слово OUTPUT:

SQL
Скопировать код
DECLARE @NewGuids TABLE (NewGuid UNIQUEIDENTIFIER);

INSERT INTO YourTable (Col1, Col2)
OUTPUT INSERTED.Id INTO @NewGuids
VALUES ('Value1', 'Value2');

SELECT NewGuid FROM @NewGuids;

Этот код возвращает новый GUID, аналогично функции SCOPE_IDENTITY(), но для колонок с уникальным идентификатором.

Разбираемся с 'OUTPUT'

Как сохранить множество GUID

Если вы хотите вставить несколько записей, OUTPUT будет прекрасным решением. Он позволяет перехватывать все новые уникальные идентификаторы, помещая их в таблицу-переменную или временную таблицу:

SQL
Скопировать код
DECLARE @InsertedGuids TABLE (Id UNIQUEIDENTIFIER);

INSERT INTO YourTable (Col1, Col2)
OUTPUT INSERTED.Id INTO @InsertedGuids
VALUES 
('Value1', 'Value2'),
('Value3', 'Value4');

Теперь @InsertedGuids содержит все только что сгенерированные GUID и готова к дальнейшим операциям.

Последовательные GUID для оптимизации производительности

Для гарантированной генерации последовательных GUID, которые являются идеальным решением для быстрых первичных ключей, воспользуйтесь функцией NewSequentialId():

SQL
Скопировать код
ALTER TABLE YourTable ADD DEFAULT NewSequentialID() FOR IdColumn

С помощью этого столбец IdColumn будет использовать последовательные GUID.

.Net практика

Если вы работаете на .Net, метод ExecuteScalar позволяет непосредственно получить GUID первичного ключа после вставки, минуя дополнительный SQL-запрос:

csharp
Скопировать код
Guid newGuid = (Guid)command.ExecuteScalar();

Влияние на индексацию

Использование GUID в качестве первичных ключей существенно влияет на индексацию таблицы. Неупорядоченные ключи (NEWSEQUENTIALID()) могут приводить к фрагментации индекса.

Автоматизация при помощи триггера

В случае массовой вставки записей систематизация процессов — залог успеха. Создание триггера может упростить процесс получения необходимого GUID.

Визуализация

Представьте себе стену, усыпанную разноцветными яйцами (каждое из которых символизирует GUID). После размещения последнего яйца (вставки записи) нам важно определить уникальный узор (GUID):

Markdown
Скопировать код
Стена из яиц 🥚🥚🥚🥚🥚🎨

В таком контексте SCOPE_IDENTITY() бессильна. Функция работает как измерительное устройство, отсчитывающее только последнее значение (IDENTITY value) для числовых позиций, но не узоров!

Markdown
Скопировать код
📏 🥚(1) ➡️ 🥚(2) ➡️ 🥚(n-1) ➡️ 🥚(n)  -- (Я измеряю расстояния, а не узоры.) ☹️

Нам необходим детектор (наш новый метод SCOPE), который бы распознавал последний уникальный узор:

Markdown
Скопировать код
🔦 🥚🥚🥚🥚🎨✨  -- (Вот! Это наш уникальный узор!) 🥳

Погружение в детали

Соответствие типов данных

При использовании OUTPUT INTO убедитесь, что типы данных столбцов в вашей таблице-переменной или временной таблице совпадают с типами данных в основной таблице. Иначе это может привести к ошибкам.

Очистка после работы

Если вы используете временную таблицу, не забывайте выполнить DROP TABLE, после получения последнего GUID:

SQL
Скопировать код
DROP TABLE IF EXISTS #TempGuids;

Выбор метода: NEWID() или NEWSEQUENTIALID()?

NEWID() создает непоследовательные, случайные GUID. Они уникальны, но могут создавать проблемы с производительностью из-за фрагментации индекса. NEWSEQUENTIALID() намного лучше для эффективного построения индексов.

Плюсы и минусы Uniqueidentifier

Тип данных uniqueidentifier гарантирует глобальную уникальность, но при этом они больше по размеру (16 байт) и сравниваются медленнее, чем целые числа. Всегда оценивайте достоинства и недостатки для вашего отдельного случая.

Особенности OUTPUT

Для более подробного изучения OUTPUT, обратитесь к прямым источникам документации T-SQL. Это поможет вам реализовывать решения, которые будут идеально подходить под ваши задачи.

Полезные материалы

  1. SCOPE_IDENTITY (Transact-SQL) – SQL Server | Microsoft Learn
  2. NEWID (Transact-SQL) – SQL Server | Microsoft Learn
  3. Сравнение производительности SQL Server INT и GUID
  4. Использование GUID в качестве первичных ключей — Kimberly L. Tripp
  5. Uniqueidentifier (Transact-SQL) – SQL Server | Microsoft Learn
  6. Как вставить строку, содержащую внешний ключ? – Форум администраторов баз данных