Получить вставленный идентификатор строки в SQL
Как получить идентификатор вставленной строки в SQL?
Таблица пользователей:
Column | Type
--------|--------------------------------
ID | * Auto-incrementing primary key
Name |
Age |
Образец запроса:
insert into users (Name, Age) values ('charuka',12)
Ответы
Ответ 1
В MySQL:
SELECT LAST_INSERT_ID();
В SQL Server:
SELECT SCOPE_IDENTITY();
В Oracle:
SELECT SEQNAME.CURRVAL FROM DUAL;
В PostgreSQL:
SELECT lastval();
(отредактировано: lastval - любое, currval требует именованной последовательности)
Примечание. Lastval() возвращает последнее значение последовательности, назначенное вашим сеансом, независимо от того, что происходит в других сеансах.
Ответ 2
В SQL Server вы можете сделать (в дополнение к другим уже существующим решениям):
INSERT INTO dbo.Users(Name, Age)
OUTPUT INSERTED.ID AS 'New User ID'
VALUES('charuka', 12)
Предложение OUTPUT
очень удобно при выполнении вставок, обновлений, удалений, и вы можете вернуть любой из столбцов, а не только столбец с автоматическим приращением ID
.
Подробнее о предложении OUTPUT в Электронная документация по SQL Server.
Ответ 3
В Oracle и PostgreSQL вы можете сделать это:
INSERT INTO some_table (name, age)
VALUES
('charuka', 12)
RETURNING ID
При выполнении этого через JDBC вы также можете сделать это с помощью кросс-СУБД (без необходимости возврата), вызвав getGeneratedKeys() после запуска INSERT
Ответ 4
У меня была такая же потребность и нашла этот ответ.
Это создает запись в таблице компании (comp), она захватывает идентификатор авто, созданный на столе компании, и переносит его в таблицу сотрудников (персонал), поэтому 2 таблицы могут быть связаны, МНОГО сотрудников в ОДНОЙ компании. Он работает на моем SQL 2008 DB, должен работать на SQL 2005 и выше.
===========================
CREATE PROCEDURE [dbo].[InsertNewCompanyAndStaffDetails]
@comp_name varchar(55) = 'Big Company',
@comp_regno nchar(8) = '12345678',
@comp_email nvarchar(50) = '[email protected]',
@recID INT OUTPUT
- " @recID" используется для хранения автоматического сгенерированного идентификатора компании, который мы собираемся захватить
AS
Begin
SET NOCOUNT ON
DECLARE @tableVar TABLE (tempID INT)
- Строка, указанная выше, используется для создания таблицы временного хранения, чтобы удерживать автоматически сгенерированный идентификационный номер для последующего использования. Он имеет только одно поле "tempID", а его тип INT совпадает с '@recID'.
INSERT INTO comp(comp_name, comp_regno, comp_email)
OUTPUT inserted.comp_id INTO @tableVar
- Строка ' OUTPUT вставлена.' используется для захвата данных из любого поля в записи, которую он создает прямо сейчас. Эти данные, которые мы хотим, это идентификатор autonumber. Поэтому убедитесь, что он говорит правильное имя поля для вашей таблицы, мой - 'comp_id'. Затем он помещается в таблицу тем, которую мы создали ранее.
VALUES (@comp_name, @comp_regno, @comp_email)
SET @recID = (SELECT tempID FROM @tableVar)
- Строка, указанная выше, используется для поиска таблицы темпостов, которую мы создали ранее, где сохраняется необходимый идентификатор. Поскольку в этой таблице темпов есть только одна запись, и только одно поле, оно будет выбирать только нужный идентификационный номер и переместить его в " @recID". ' @recID' теперь имеет идентификационный номер, который вы хотите, и вы можете использовать его так, как хотите, как я использовал его ниже.
INSERT INTO staff(Staff_comp_id)
VALUES (@recID)
End
- Так ты и хочешь. Я искал что-то вроде этого целую вечность, с этим подробным разрывом, надеюсь, это поможет.