2010-08-06 113 views
18

在SQL Server 2008或更高版本什么是最好/最安全/最正确的方式最安全的方式从表中获取最后一条记录ID

  1. 检索ID(基于自增主键)从数据库中表?
  2. 检索一些其他列的最后一行的值(如SELECT TOP 1 FROM TABLE ORDER BY DESC)?
+0

稍微复杂一点是,您是希望发布的最后一个仍在数据库中的ID还是上次发布的ID--记录可能已被添加和删除。在这种情况下,使用max/top等将无法获得您的ID。 – Andrew 2010-08-06 11:57:22

回答

15

最安全的方式是在插入行的过程中输出或返回scope_identity(),然后根据该ID检索行。要避免使用@@身份,因为当触发器在场时你可以得到不正确的ID。

任何要求最大值/最高值1的技术都会遇到竞争条件,即同时添加2个人的竞争条件会在他们查找最高ID时返回相同的ID。

+1

我读过这篇文章http://msdn.microsoft.com/en-us/library/ms190315.aspx关于@@身份和scope_identity,看来你的答案是最合适的。在接受答案之前,我还有两个问题 - 如果之前没有插入,并且我们请求scope_identity(),它会返回任何内容吗?另一种方法是,如果我要在应用程序中创建业务密钥,然后将它们存储到表中,并且我希望它们从身份派生,那么查询scope_identity()会很好吗? – mare 2010-08-07 00:57:51

+0

如果你未能插入任何东西scope_identity()将返回null;一旦你返回了scope_identity()并且拥有了标识字段,你就可以在查询中使用它来返回该行,无论你决定什么目的。 – Andrew 2010-08-07 09:59:41

2

另一种方式 -

select * from <table> where id=(select max(id) from <table>) 

也可以通过这个链接 - 如果你的意思是选择插入的最后一条记录的ID

http://msdn.microsoft.com/en-us/library/ms175098.aspx

+0

这是另一种方式,但我不确定它是否不会遇到与SELECT TOP.does相同的可能问题。如果有更深入的SQL知识的人对这两种解决方案在高容量使用情况下的可靠性有多评论,那将会很好。 – mare 2010-08-06 08:45:13

4
1. SELECT MAX(Id) FROM Table 
+1

谢谢!最好的,只有一个:) – KingRider 2015-06-17 14:34:36

1

而且,其

SELECT @@IDENTITY FROM table 
13
SELECT IDENT_CURRENT('Table') 

你可以这样examole之一:

SELECT * FROM Table 
WHERE ID = (
    SELECT IDENT_CURRENT('Table')) 

SELECT * FROM Table 
WHERE ID = (
    SELECT MAX(ID) FROM Table) 

SELECT TOP 1 * FROM Table 
ORDER BY ID DESC 

但因为不需要索引扫描第一个将更有效率(如果你的ID列有索引)。

第二个解决方案相当于第三个(它们都需要扫描表以获取最大ID)。

+0

第二个错误,如果任何行删除,将给出错误的答案。 – 2014-08-13 11:30:40

2

我想,这其中也将工作:

SELECT * FROM ORDER BY ID DESC LIMIT 0,1

3
SELECT id FROM Table WHERE id = (SELECT MAX(id) FROM Table) 

这里表是指你的数据库表名和ID意味着你的表字段名称。

+3

欢迎来到Stack Overflow!这个问题已经有了一个被接受的答案,并且在4年前增加了。在这种情况下,没有额外的答案needend。 – 2015-01-29 06:39:13

+2

@j_s_stack,他给出了更好的答案,那么为什么你认为呢? – partho 2016-10-19 07:50:50

+0

这只是一个复制粘贴答案。请删除它。 – 2017-07-27 07:24:01

相关问题