实际插入的行ID

时间:2012-02-12 18:15:56

标签: sql-server insert

我已在此声明中的数据库中创建了表

CREATE TABLE tPerson
    (
        id INT NOT NULL PRIMARY KEY identity(1,1)
        , name NVARCHAR(100) not null
        , email NVARCHAR(30) not null
    )
GO

现在我使用INSERT插入新值。我的问题是如何才能获得当前添加行的ID?有什么想法??

5 个答案:

答案 0 :(得分:5)

假设SQL服务器,您应该查看this article以便更好地理解检索身份。

这是一个片段:

  

SELECT @@ IDENTITY

     

它返回在a上生成的最后一个IDENTITY值   连接,不管产生值的表,和   无论产生价值的陈述的范围如何。   @@ IDENTITY将返回输入表中的最后一个标识值   你当前的会议。虽然@@ IDENTITY仅限于当前   会话,它不限于当前范围。如果你有一个触发器   在一个导致在另一个表中创建标识的表上,您   将获得最后创建的标识,即使它是   创建它的触发器。

     

SELECT SCOPE_IDENTITY()

     

它返回生成的最后一个IDENTITY值   一个连接和一个声明在同一范围内,无论如何   产生价值的表。 SCOPE_IDENTITY(),如@@ IDENTITY,将会   返回在当前会话中创建的最后一个标识值,但它   也会将其限制在您当前的范围内。换句话说,它   将返回您明确创建的最后一个标识值,   而不是由触发器或用户创建的任何标识   定义函数。

     

选择IDENT_CURRENT('tablename')

     

它返回最后一个IDENTITY值   在表中生成,无论创建的连接如何   值,而不管产生的语句的范围   值。 IDENT_CURRENT不受范围和会话的限制;它是   仅限于指定的表格。 IDENT_CURRENT返回标识值   为任何会话和任何范围中的特定表生成。

答案 1 :(得分:1)

它看起来像SQL Server,就这种情况而言,只需使用:

INSERT INTO dbo.tPerson(....) VALUES(.....)

DECLARE @NewID INT
SELECT @NewID = SCOPE_IDENTITY()

SCOPE_IDENTITY返回当前作用域中最后插入的IDENTITY值。

旁注:“电子邮件”只有30个字符!?!?我通常把它作为我表中最长的列 - 200个字符甚至更多: - )

答案 2 :(得分:1)

对MS SQL Server使用@@IDENTITYSCOPE_IDENTITY:)

答案 3 :(得分:0)

尝试

SELECT @@IDENTITY AS LastID
INSERT后

答案 4 :(得分:0)

您也可以直接通过JDBC执行此操作以避免选择,因为通常插入语句将返回您可能要验证的插入行数。 Spring通过其JdbcTemplate支持此功能,请参阅here