如何在SQL中检索插入行的ID?
Column | Type
--------|--------------------------------
ID | * Auto-incrementing primary key
Name |
Age |
insert into users (Name, Age) values ('charuka',12)
答案 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
列。
答案 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
- 你去吧。多年来我一直在寻找这样的东西,详细分解,希望这会有所帮助。