我已在此声明中的数据库中创建了表
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?有什么想法??
答案 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使用@@IDENTITY
或SCOPE_IDENTITY
:)
答案 3 :(得分:0)
尝试
SELECT @@IDENTITY AS LastID
INSERT后
答案 4 :(得分:0)
您也可以直接通过JDBC执行此操作以避免选择,因为通常插入语句将返回您可能要验证的插入行数。 Spring通过其JdbcTemplate支持此功能,请参阅here