我在这条语句中创建了我的数据库中的表格
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?有什么想法吗?
我在这条语句中创建了我的数据库中的表格
CREATE TABLE tPerson
(
id INT NOT NULL PRIMARY KEY identity(1,1)
, name NVARCHAR(100) not null
, email NVARCHAR(30) not null
)
GO
SELECT @@IDENTITY
它返回连接上产生的最后一个IDENTITY值,无论产生该值的表以及产生该值的语句的范围如何。@@IDENTITY将返回当前会话中插入到表中的最后一个标识值。虽然@@IDENTITY仅限于当前会话,但不限于当前范围。如果在某个表上创建了触发器并导致在另一个表中创建标识,则将获得最后创建的标识,即使是触发器创建它。
SELECT SCOPE_IDENTITY()
它返回同一作用域内由语句生成的最后一个IDENTITY值,而与产生该值的表无关。SCOPE_IDENTITY()与@@IDENTITY相似,它将返回当前会话中创建的最后一个标识值,但它还将限制为您的当前作用域。换句话说,它将返回您明确创建的最后一个标识值,而不是由触发器或用户定义函数创建的任何标识。
SELECT IDENT_CURRENT('tablename')
它返回指定表中产生的最后一个IDENTITY值,无论创建该值的连接以及产生该值的语句的范围如何。IDENT_CURRENT不受作用域和会话限制; 它仅限于指定的表。IDENT_CURRENT返回在任何会话和任何范围中为特定表生成的标识值。
看起来像是SQL Server,如果是的话,只需使用:
INSERT INTO dbo.tPerson(....) VALUES(.....)
DECLARE @NewID INT
SELECT @NewID = SCOPE_IDENTITY()
SCOPE_IDENTITY
返回当前作用域中最后插入的IDENTITY值。
顺便提一下:"email"只有30个字符长!?!?我通常会将其设置为表中最长的列-200个字符甚至更多:-)
在 MS SQL Server 中使用 @@IDENTITY
或 SCOPE_IDENTITY
:)
SCOPE_IDENTITY()
- 其他选项经常会产生意想不到的副作用和结果... - marc_s尝试
SELECT @@IDENTITY AS LastID
在你的INSERT之后
你也可以直接通过JDBC来实现这个功能,避免选择的需要,因为通常插入语句会返回插入的行数,你可能想要验证。Spring通过其JdbcTemplate支持此功能,请参见这里。