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


14

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

id  row
42 first row
1 second row
2 third row

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

我知道我可以order by,但是为什么会这样呢?我的大部分数据都是通过Web应用程序插入的,来自此应用程序的所有插入都将按照先进先出的顺序进行,例如最新插入在底部,因此id都排成一行。服务器或Management Studio中是否有某些设置会导致这种不正确的订购?


正如我有时看到的,如果选择单个表,则取决于PK的顺序如何显示行。如果您进行一些连接,则它可能会根据其他表PK,FK和索引而改变...
GuillermoGutiérrez2013年

也要注意旋转木马扫描。
Michael Green

Answers:


21

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

来自Craig Freedman

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

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


13

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

换句话说,我知道您已经知道答案了,但是还不能完全说明:

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


我并没有计划要根据订单而定,但是从视觉上看,我最后插入的项目突然位于顶部有点令人讨厌。
本·布罗卡

我想这是因为您正在使用Open Table。在Management Studio 2008中,此命令已分为“编辑前n行”和“选择前N行”-当选择后者时,您可以自由编辑结果查询,例如,删除前行并添加订单。
亚伦·伯特兰

是Management Studio 2008,服务器是2005,应该更清晰一些。我不知道这里有一个“开放表”命令,我一直使用这些select陈述
Ben Brocka

4
好的,好的观点仍然存在,我知道令人讨厌的是,数据以您不期望的顺序返回,但是我希望现在很清楚为什么SQL Server并不真正关心您期望的顺序,除非您告诉您所关心的顺序通过添加order by子句。:-)
亚伦·伯特兰

1

这是因为该表是堆表(最有可能)并且未建立索引。将ID列PRIMARY KEY设为和IDENTITY。SQL Server物理上根据索引存储数据-例如,如果id是聚簇索引(例如主键),则数据将按照id的顺序进行物理存储,并且即使没有一个ORDER BY条款。否则,行的排序对数据库根本不重要。因此,让应用程序依赖于数据库中行的顺序(以及依赖于以特定顺序排列的列)并不是一个好习惯。应用程序需要使用数据库中存在的任何键来识别行。


很高兴知道。我知道这是更改应用程序使用的提示order by(这是一个继承了很多错误做法的应用程序),但是我想知道它为什么会发生。
Ben Brocka

5
只是更改表的结构,以便SELECT *没有ORDER BY 可能以“正确”的顺序返回(但仍不能保证)?
亚伦·伯特兰

在具有聚集索引的表中进行简单SELECT时,将以聚集索引的顺序返回。并不是我应该清楚的那样,它只是说明特定列按物理顺序对数据进行排序的一个例子,但是绝对不能确定在每个查询中都可以正确返回该数据。Mea culpa。
威尔

5
什么是聚簇索引并不重要。SQL Server仍可能基于多种因素,基于某些其他索引返回订单。在某些列上创建主键并不能保证没有排序依据的选择总是突然回到该列的顺序。您大多数时候都可以观察到吗?当然。但这与保证不同。我从未在街道上见过北极熊,但是没有北极熊的力场可以阻止它发生。
阿龙贝特朗

4
无论如何,我的观点是,添加ORDER BY子句比对表进行模式更改并希望排序永远是您期望的要好得多(不要担心破坏性要小得多)。
阿龙贝特朗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.