在SQL中检索插入的行ID

11

如何在SQL中获取插入行的ID?

用户表:

Column  | Type
--------|--------------------------------
ID      | * Auto-incrementing primary key
Name    | 
Age     | 

查询示例:

insert into users (Name, Age) values ('charuka',12)

7
你使用的是哪种数据库? - René Nyffenegger
4个回答

40
在MySQL中:
SELECT LAST_INSERT_ID();

在SQL Server中:

SELECT SCOPE_IDENTITY();

在 Oracle 中:

SELECT SEQNAME.CURRVAL FROM DUAL;

在 PostgreSQL 中:

SELECT lastval();

(编辑:lastval可以是任何值,currval需要一个命名序列)

注意:lastval() 返回您的会话分配的最新序列值,独立于其他会话中发生的情况。

你需要确保这是一个原子事务。自从你检索了SCOPE_IDENTITY以来,可能已经插入了另一行,你会错过你的行ID。 - Petrus Theron
2
@FreshCode中的scope_identity()是会话特定的,就像currval()适用于PostgreSQL和我认为也适用于Oracle一样。last_insert_id()也是如此。 - RichardTheKiwi
@RichardTheKiwi 我在寻找 H2 数据库的答案,它是这个:'SELECT IDENTITY();'。 - GamerJosh

13

在 SQL Server 中,除了已有的其他解决方案外,您还可以执行以下操作:

INSERT INTO dbo.Users(Name, Age) 
OUTPUT INSERTED.ID AS 'New User ID'
VALUES('charuka', 12)

OUTPUT子句在执行插入、更新和删除时非常有用,您可以返回任何列,而不仅仅是自增的ID列。

SQL Server Books Online中了解更多关于OUTPUT子句的信息。


请注意,如果您在插入表上有一个插入触发器,则此方法无效。 - Stefan Steiger

3
在Oracle和PostgreSQL中,您可以这样做:
INSERT INTO some_table (name, age)
VALUES
('charuka', 12)
RETURNING ID
通过JDBC进行此操作时,您还可以以跨DBMS的方式执行此操作(无需使用RETURNING),只需在运行INSERT后调用getGeneratedKeys()即可。

0

我有同样的需求,并找到了这个答案...

这将在公司表(comp)中创建一条记录,然后获取在公司表上创建的自动ID并将其放入员工表(staff)中,以便将这两个表链接起来,即多个员工对应一个公司。它适用于我的SQL 2008数据库,也应该适用于SQL 2005及以上版本。

===========================

CREATE PROCEDURE [dbo].[InsertNewCompanyAndStaffDetails]

 @comp_name varchar(55) = 'Big Company',

 @comp_regno nchar(8) = '12345678',

 @comp_email nvarchar(50) = 'no1@home.com',

 @recID INT OUTPUT

-- '@recID' 用于保存我们即将获取的公司自动生成的 ID 号码

AS
 Begin

  SET NOCOUNT ON

  DECLARE @tableVar TABLE (tempID INT)

-- 上面这行代码用于创建一个临时表,以保存自动生成的ID号以备后用。它只有一个字段'tempID',其类型INT'@recID'相同。

  INSERT INTO comp(comp_name, comp_regno, comp_email) 

  OUTPUT inserted.comp_id INTO @tableVar

——上面的“OUTPUT inserted.”行用于从正在创建的记录中获取任何字段的数据。我们想要的数据是ID自动编号。因此,请确保它为您的表格指定了正确的字段名称,我的是'comp_id'。然后将其放入我们之前创建的临时表中。

  VALUES (@comp_name, @comp_regno, @comp_email)

  SET @recID = (SELECT tempID FROM @tableVar)

-- 上面的代码用于搜索我们之前创建的临时表,其中保存了我们需要的ID。由于这个临时表中只有一条记录和一个字段,它将仅选择您需要的ID号并将其放入 '@recID' 中。'@recID' 现在具有您想要的ID号,您可以像我下面使用它一样随心所欲地使用。

  INSERT INTO staff(Staff_comp_id) 
  VALUES (@recID)

 End

-- 所以就是这样。我寻找这样的东西已经很久了,有了这个详细的分解,希望能对你有所帮助。


你在哪里找到答案的?请提供归属。同时,请勿在多个问题中重复完全相同的答案(https://dev59.com/s2435IYBdhLWcg3wxC9p#5634263)。 - TylerH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接