【问题标题】:Retrieve inserted row ID in SQL在 SQL 中检索插入的行 ID
【发布时间】:2011-01-19 11:18:09
【问题描述】:

如何在 SQL 中检索插入行的 ID?

用户表:

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

查询示例:

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

【问题讨论】:

  • 你用的是什么数据库?

标签: sql


【解决方案1】:

在 MySQL 中:

SELECT LAST_INSERT_ID();

在 SQL Server 中:

SELECT SCOPE_IDENTITY();

在甲骨文中:

SELECT SEQNAME.CURRVAL FROM DUAL;

在 PostgreSQL 中:

SELECT lastval();

(已编辑:lastval 是 any,currval 需要命名序列) 注意:lastval() 返回您的会话分配的最新序列值,与其他会话中发生的情况无关。

【讨论】:

  • 您需要确定这是一个原子事务。自从您检索到 SCOPE_IDENTITY 后,可能已经插入了另一行,您会错过该行的 ID。
  • @FreshCode scope_identity() 是特定于会话的,就像 currval() 用于 PostgreSQL 一样,我也相信 Oracle。 last_insert_id() 也一样
  • @RichardTheKiwi 我一直在寻找 H2 的答案。就是这样:'SELECT IDENTITY();'。
【解决方案2】:

在 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 子句的更多信息

【讨论】:

  • 请注意,如果您在插入表上有插入触发器,这将不起作用。
【解决方案3】:

在 Oracle 和 PostgreSQL 中,您可以这样做:

INSERT INTO some_table(姓名,年龄) 价值观 ('charuka',12) 返回 ID

通过 JDBC 执行此操作时,您还可以通过在运行 INSERT 后调用 getGeneratedKeys() 以跨 DBMS 方式执行此操作(无需返回)

【讨论】:

    【解决方案4】:

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

    这会在公司表 (comp) 中创建一条记录,它会抓取在公司表上创建的自动 ID 并将其放入员工表 (staff) 中,因此可以将 2 个表链接,将许多员工链接到一个公司。它适用于我的 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
    

    -- 就这样。我一直在寻找这样的东西,有了这个详细的分解,我希望这会有所帮助。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-23
    • 2017-07-09
    • 2011-09-08
    • 1970-01-01
    • 2012-12-23
    • 2011-11-02
    • 2014-08-08
    • 2021-11-21
    相关资源
    最近更新 更多