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


9

每当我手动将行插入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中是否存在导致此不正确排序的设置?

  0

正如我有时看到的,它取决于PK的排序如何显示行,如果您选择一个表。如果你进行一些连接,它可以根据其他表PK,FK和索引进行更改... 18 7月. 132013-07-18 22:00:36

  0

请注意[旋转木马](http://technet.microsoft.com/en-us/library/) ms191475%28v = sql.105%29.aspx)也扫描。 01 4月. 152015-04-01 03:49:03

17

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

Craig Freedman

与ORDER BY结合上增加确定性的集中返回的行 的。如果没有ORDER BY,返回的行集取决于查询计划,甚至可能因执行而不同。

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


0

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

  0

很高兴知道。我知道这是一个暗示,要改变应用程序使用'order by'(这是一个有很多不好的练习的继承应用程序),但我想知道它为什么发生。 14 9月. 112011-09-14 19:49:38

+4

只改变表的结构,以便不带'ORDER BY' ***的'SELECT *'可能会以“正确”的顺序返回(但仍不能保证)? 14 9月. 112011-09-14 20:22:26

  0

对于具有聚集索引的表的简单SELECT,将按照聚簇索引的顺序返回。并不像我本应该清楚的那样清楚,这是一个数据在特定列物理排序时的示例,但绝对不是在每个查询中都会正确返回。 Mea culpa。 14 9月. 112011-09-14 20:27:39

+4

聚集索引是什么并不重要。根据各种因素,SQL Server仍可能会基于其他一些索引返回订单。在某个列上创建主键***不保证没有订单的选择会突然回到该列的顺序。大部分时间可以观察吗?当然。但这不是一个保证。我从未在街上看到一只北极熊,但没有北极熊的力量来阻止它发生。 14 9月. 112011-09-14 20:41:09

+3

无论如何,我的观点是,添加一个ORDER BY'子句是一个更好的保证(不必介意更少的破坏性)比对表进行模式更改和*希望*的排序将如你所愿,永远。 14 9月. 112011-09-14 20:42:25


10

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

换句话说,我知道你已经知道答案,但它不能充分说明:

如果你想依靠一个查询的顺序,ALWAYS添加ORDER BY

  0

我并不打算依靠订单,但从视觉上来说,我最后插入的项目突然位于顶部,这有点令人讨厌。 14 9月. 112011-09-14 20:18:15

  0

我想这是因为你正在使用Open Table。在Management Studio 2008中,此命令已分化为“编辑前n行”和“选择前n行” - 当您选择后者时,可自由编辑生成的查询,例如,删除顶部并添加一个订单。 14 9月. 112011-09-14 20:21:07

  0

它的管理工作室2008年,服务器是2005年,应该更清晰。我不知道有一个“开放表”的命令,我一直使用'select'命令 14 9月. 112011-09-14 20:36:30

+4

好的,好的一点仍然存在,我明白这很令人讨厌,数据以你不期望的顺序回来,但我希望现在很清楚为什么SQL Server不关心你期望的顺序*除非你通过添加一个order by子句告诉它你关心。 :-) 14 9月. 112011-09-14 20:37:35