实际插入的行ID

3

我在这条语句中创建了我的数据库中的表格

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?有什么想法吗?

3
哪个数据库?SQL Server?MySQL?Oracle?它们在完成此任务时具有不同的功能。 - Dan J
有关 SQL Server,请参见链接 - Steven Schroeder
MS SQL Server 2008 R2 Express - Jacek
为了确保,我会在电子邮件栏中使用70个字符。我的当前工作电子邮件有34个字符。 - Gaspa79
5个回答

5
假设您使用SQL Server,您应该查看 这篇文章 来了解如何检索标识列的正确方法。
以下是摘录:

SELECT @@IDENTITY

它返回连接上产生的最后一个IDENTITY值,无论产生该值的表以及产生该值的语句的范围如何。@@IDENTITY将返回当前会话中插入到表中的最后一个标识值。虽然@@IDENTITY仅限于当前会话,但不限于当前范围。如果在某个表上创建了触发器并导致在另一个表中创建标识,则将获得最后创建的标识,即使是触发器创建它。

SELECT SCOPE_IDENTITY()

它返回同一作用域内由语句生成的最后一个IDENTITY值,而与产生该值的表无关。SCOPE_IDENTITY()与@@IDENTITY相似,它将返回当前会话中创建的最后一个标识值,但它还将限制为您的当前作用域。换句话说,它将返回您明确创建的最后一个标识值,而不是由触发器或用户定义函数创建的任何标识。

SELECT IDENT_CURRENT('tablename')

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


不要忘记使用OUTPUT子句,它是可靠的!参考Microsoft Connect - HABO

1

看起来像是SQL Server,如果是的话,只需使用:

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

DECLARE @NewID INT
SELECT @NewID = SCOPE_IDENTITY()

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

顺便提一下:"email"只有30个字符长!?!?我通常会将其设置为表中最长的列-200个字符甚至更多:-)


1

在 MS SQL Server 中使用 @@IDENTITYSCOPE_IDENTITY :)


我建议始终使用SCOPE_IDENTITY() - 其他选项经常会产生意想不到的副作用和结果... - marc_s

0

尝试

SELECT @@IDENTITY AS LastID

在你的INSERT之后


2
你应该使用 SCOPE_IDENTITY() - 而不是 @@IDENTITY@@IDENTITY 可能会意外返回错误的结果...。参考链接 - marc_s

0

你也可以直接通过JDBC来实现这个功能,避免选择的需要,因为通常插入语句会返回插入的行数,你可能想要验证。Spring通过其JdbcTemplate支持此功能,请参见这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接