2012-02-12 72 views
3

我已经创建的表在我的分贝在此声明实际插入的行ID

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

现在我插入带有插入新的价值。我的问题是如何获得当前添加的行的ID?任何想法 ??

+3

哪个数据库? SQL Server? MySQL的?甲骨文?它们具有完成此功能的不同功能。 – 2012-02-12 18:18:03

+0

对于SQL Server,请参阅[链接](http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-记录/) – 2012-02-12 18:24:34

+0

MS SQL Server 2008 R2 Express – Jacek 2012-02-12 18:38:26

回答

5

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

这里有一个片段:

SELECT @@ IDENTITY

它返回一个 连接最后产生的IDENTITY值,不管产生的数据表,并 不管产生价值的陈述的范围。 @@ IDENTITY将返回您当前会话中输入到 表中的最后一个标识值。虽然@@ IDENTITY仅限于当前的 会话,但它不限于当前范围。如果在导致在另一个表中创建标识的表上有触发器 ,则您的 将获得最后创建的标识,即使它是创建该标识的 触发器。

SELECT SCOPE_IDENTITY()

它返回上 的连接,并通过在同一范围的陈述所产生的最后一个标识值,而不管 表的所产生的值。 SCOPE_IDENTITY(),如@@ IDENTITY, 将返回当前会话中创建的最后一个标识值,但其 也会将其限制为您当前的范围。换句话说,它将返回您明确创建的最后一个标识值,即 ,而不是由触发器或用户定义的函数创建的任何标识。

SELECT IDENT_CURRENT(“表名”)

它返回一个表中产生的最后一个标识值 ,而不考虑创建该 值的连接的,也不管所产生的声明的范围的值为 。IDENT_CURRENT不受范围和会话的限制;它是 限于一个指定的表。 IDENT_CURRENT返回为任何会话和任何范围中的特定表生成的标识值 。

+0

并且不要忘记OUTPUT子句。这是可靠的! [参考Microsoft连接](https://connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-incorrect-value) – HABO 2012-02-13 01:56:53

1

它看起来像SQL服务器,并且这种情况下,只需使用:

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

DECLARE @NewID INT 
SELECT @NewID = SCOPE_IDENTITY() 

SCOPE_IDENTITY返回在当前的范围内最后插入IDENTITY值。

注意:“电子邮件”只有30个字符!!?我通常做,在我的表中的最长柱 - 200个字符甚至更多:-)

0

尝试

SELECT @@IDENTITY AS LastID 

你INSERT后

+2

[您应该使用'SCOPE_IDENTITY()' - **而不是**'@@ IDENTITY'](http://blog.sqlauthority.com/2007/03/25/sql- server @ identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record /) - '@@ IDENTITY'可以意外地返回错误的结果.... – 2012-02-12 18:25:00

1

使用@@IDENTITYSCOPE_IDENTITY MS SQL Server的:)

+0

我建议总是使用'SCOPE_IDENTITY ()' - 其他选项往往具有意想不到的副作用和结果.... – 2012-02-12 18:27:07

0

您也可以通过JDBC直接执行此操作以避免选择,因为通常情况下,插入语句将返回您可能要验证的插入行数。 Spring通过它的JdbcTemplate支持这个,参见here