Получение ID последней вставленной строки в SQL: без временных таблиц
Быстрый ответ
Для получения ID последней добавленной записи в MS SQL Server используйте функцию SCOPE_IDENTITY(), в MySQL – LAST_INSERT_ID(), а в PostgreSQL следует применить ключевое слово RETURNING.
MS SQL Server:
INSERT INTO YourTable (...) VALUES (...);
SELECT SCOPE_IDENTITY(); -- Возврат ID свежедобавленной записи
MySQL:
INSERT INTO YourTable (...) VALUES (...);
SELECT LAST_INSERT_ID(); -- Возврат ID недавно вставленной записи
PostgreSQL:
INSERT INTO YourTable (...) VALUES (...) RETURNING ID; -- Вставка записи и возврат её ID

SCOPE_IDENTITY() – вундеркинд SQL Server
В MS SQL Server функция SCOPE_IDENTITY() возвращает ID, сгенерированный в текущем исполняемом контексте, исключая запутанность с ID, созданными триггерами или в других сессиях.
OUTPUT – вспомогательный оператор SQL Server
Оператор OUTPUT в SQL Server позволяет мгновенно получить ID добавленных строк, что особенно важно при массовом добавлении строк за одну операцию.
INSERT INTO YourTable (...)
OUTPUT Inserted.ID
VALUES (...); -- Возврат ID всех добавленных записей
Обращение с множественными вставками
При добавлении множества строк функция SCOPE_IDENTITY() может показаться неэффективной, вне зависимости от этого оператор OUTPUT обеспечивает возврат всех необходимых ID.
Визуализация
Можно представить процесс добавления записи и получения ID последней строки как фотофиниш в гонке данных.
Навигация по сложным сценариям
Будьте осмотрительны при использовании SCOPE_IDENTITY() в распределённых транзакциях и обдумайте использование функции XACT_STATE() или других методов для обработки подобных случаев.
Основные правила получения ID
Всегда чётко определите колонки, содержащие идентификаторы, и будьте осторожны при использовании триггеров. При использовании оператора OUTPUT помните о производительности.
Применение теории на практике
Пример использования OUTPUT с таблицей-переменной и получения ID сразу после добавления одной строки с помощью SCOPE_IDENTITY():
DECLARE @InsertedIDs TABLE (ID INT);
INSERT INTO YourTable (...)
OUTPUT Inserted.ID INTO @InsertedIDs
VALUES (...);
SELECT ID FROM @InsertedIDs; -- Возврат сохранённых ID
DECLARE @LastID INT;
INSERT INTO YourTable (...)
VALUES (...);
SET @LastID = SCOPE_IDENTITY(); -- Сохранение ID последней добавленной записи
Пословица к размышлению
Даже надёжные инструменты вроде SCOPE_IDENTITY() могут вызвать неприятности после массового добавления строк. Поэтому регулярно проводите тесты приложений в сложных условиях.
Полезные материалы
- Официальная документация функции LASTINSERTID() от MySQL.
- Примеры получения ID недавно добавленной записи на Stack Overflow.
- Оператор RETURNING в официальной документации PostgreSQL.
- Руководство по применению функции SCOPE_IDENTITY() в SQL Server.
- Как узнать ID последней добавленной строки в SQLite.
- Особенности вычисления ID последней добавленной строки в MariaDB.
- Советы от Oracle по получению идентификатора последней добавленной строки.