Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从表中获取最后一条记录ID的最安全方法_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 从表中获取最后一条记录ID的最安全方法

Sql 从表中获取最后一条记录ID的最安全方法,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,在SQL Server 2008及更高版本中,什么是最佳/最安全/最正确的方法 是否基于从数据库表中自动递增主键检索ID? 要检索某个其他列(如)的最后一行的值,请从表ORDER BY DESC中选择TOP 1? 还有一条路- select * from <table> where id=(select max(id) from <table>) 你也可以查看这个链接- 如果您的意思是选择最后插入的记录的ID,则 SELECT @@IDENTITY FROM tabl

在SQL Server 2008及更高版本中,什么是最佳/最安全/最正确的方法

是否基于从数据库表中自动递增主键检索ID? 要检索某个其他列(如)的最后一行的值,请从表ORDER BY DESC中选择TOP 1? 还有一条路-

select * from <table> where  id=(select max(id) from <table>)
你也可以查看这个链接-


如果您的意思是选择最后插入的记录的ID,则

SELECT @@IDENTITY FROM table
您可以使用以下示例之一:

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。

最安全的方法是在插入行的过程中输出或返回范围标识,然后根据该标识检索行。避免使用@标识,因为在触发器起作用时可能会获取不正确的标识


任何要求最大值/top 1的技术都会遇到一种竞争条件,即两个人同时添加,然后在查找最高ID时会得到相同的ID。

我认为这一方法也会起作用:

按id从订单中选择*描述限制0,1

您可以尝试:

SELECT id FROM your_table WHERE id = (SELECT MAX(id) FROM your_table)

其中id是您的表的主键

从表中选择LASTrow\u名称

这是另一种方法,但我不确定它是否会遇到和选择TOP..相同的可能问题。如果有人对这两种解决方案都有更深入的SQL知识,并对它们在高容量使用场景中的可靠性发表评论,那就太好了。一个稍微复杂的问题是,您是希望最后一个ID仍然存在于数据库中,还是希望最后一个ID被发布—记录可能被添加和删除。在这种情况下,使用max/top等将无法获得该id。我阅读了这篇关于@identity和scope\u identity的文章,您的答案似乎是最合适的。在接受回答之前,我还有两个问题-如果之前没有插入,我们请求scope_identity,它会返回任何内容吗?另外,如果我要在我的应用程序中创建业务密钥,然后将它们存储到表中,并且我希望它们确实从标识派生,那么查询scope\u标识是否可以?如果您未能插入任何内容,scope\u标识将返回null;返回scope_identity并具有identity字段后,您可以在查询中使用它返回到该行,以实现您决定的任何目的。scope_identity将返回当前范围内最后一个成功插入的id,无论这是否是最后一次尝试,也不管它是否是同一个表。如果表没有触发器,则@tableId中的output inserted.ID在获取ID时更可靠。第二个错误是,如果删除任何行,将给出错误的答案。欢迎使用堆栈溢出!这个问题已经有了一个公认的答案,而且已经4岁了。在这种情况下,不需要额外的答案。@j_s_stack,他给出了一个更好的答案,那么你为什么这么认为?这只是一个复制粘贴答案。请删除它。我不知道为什么这个答案在下面一个几乎相同的答案发表5年后有更多的投票,但我必须同意j_s_stack和@reaz-murshed。谢谢!最好的,只有一个:这个问题已经包含了多个答案和一个公认的答案。你能通过编辑你的答案来解释你的答案与其他答案的不同之处吗?还要知道,从长远来看,只有代码的答案是没有用的。
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
SELECT id FROM your_table WHERE id = (SELECT MAX(id) FROM your_table)