在SQL中检索插入的行ID

时间:2011-01-19 11:18:09

标签: sql

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

用户表:

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

查询示例:

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

4 个答案:

答案 0 :(得分:36)

在MySQL中:

SELECT LAST_INSERT_ID();

在SQL Server中:

SELECT SCOPE_IDENTITY();

在Oracle中:

SELECT SEQNAME.CURRVAL FROM DUAL;

在PostgreSQL中:

SELECT lastval();

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

答案 1 :(得分:11)

在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子句

答案 2 :(得分:3)

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

INSERT INTO some_table (name, age)
VALUES
('charuka', 12)
RETURNING ID

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

答案 3 :(得分:1)

我有同样的需要并找到了答案..

这会在公司表(comp)中创建一条记录,它会抓取在公司表上创建的自动ID并将其放入员工表(员工)中,这样就可以将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) = '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

- 你去吧。多年来我一直在寻找这样的东西,详细分解,希望这会有所帮助。