Получение 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()
могут вызвать неприятности после массового добавления строк. Поэтому регулярно проводите тесты приложений в сложных условиях.
Полезные материалы
- Официальная документация функции LAST_INSERT_ID() от MySQL.
- Примеры получения ID недавно добавленной записи на Stack Overflow.
- Оператор RETURNING в официальной документации PostgreSQL.
- Руководство по применению функции SCOPE_IDENTITY() в SQL Server.
- Как узнать ID последней добавленной строки в SQLite.
- Особенности вычисления ID последней добавленной строки в MariaDB.
- Советы от Oracle по получению идентификатора последней добавленной строки.