为什么 SSMS 在表格顶部而不是底部插入新行?

Ben*_*cka 14 sql-server ssms identity

每当我在 SQL Server Management Studio 2008(数据库是 SQL Server 2005)的表中手动插入一行时,我的新行就会出现在列表的顶部而不是底部。我正在使用身份列,这会导致诸如

id  row
42 first row
1 second row
2 third row
Run Code Online (Sandbox Code Playgroud)

当获取行且未明确排序时。当为 Web 应用提取行并更改TOP 1查询返回的内容时,这会导致不同的外观。

我知道我可以order by,但为什么会发生这种情况?我的大部分数据都是通过 Web 应用程序插入的,从该应用程序插入的所有数据都按照先进先出的顺序进行,例如,最新的插入位于底部,因此 ID 都在一行中。服务器或 Management Studio 中是否有某些设置会导致这种不正确的排序?

Nic*_*mas 22

在 SQL 世界中,顺序不是一组数据的固有属性。因此,除非您使用ORDER BY子句查询数据,否则您无法从 RDBMS 获得数据将以特定顺序返回的保证——甚至以一致的顺序返回。

来自克雷格弗里德曼

将 TOP 与 ORDER BY 结合使用可以为返回的行集添加确定性。如果没有 ORDER BY,返回的行集取决于查询计划,甚至可能因执行而异。

ORDER BY如果您希望结果集中定义明确且一致的顺序,请始终使用。永远不要依赖您的数据库如何在磁盘上存储行(例如,通过聚集索引)来保证查询中数据的特定顺序。


Aar*_*and 13

只是为了增加其他答案:根据定义,表是一组无序的行。如果不指定ORDER BY子句,SQL Server 可以自由地以它认为最有效的任何顺序返回行。这通常恰好与插入的顺序一致,因为大多数表在标识、日期时间或其他单调递增的列上都有聚集索引,但您应该完全这样对待它:巧合。它可以随着新数据、统计更新、跟踪标志、对 maxdop 的更改、查询提示、对连接或查询中的 where 子句的更改、由于服务包/累积更新/修补程序/升级而对优化器的更改而更改,将数据库移动到不同的服务器等。

换句话说,我知道你已经知道答案了,但还不够清楚:

如果您想依赖查询的顺序,请始终添加 ORDER BY.