Получить вставленный идентификатор строки в 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

- Так ты и хочешь. Я искал что-то вроде этого целую вечность, с этим подробным разрывом, надеюсь, это поможет.