SQL插入时排序是否可行?

4
在SQL中,当向一个已经排序的表中插入数据时,是否可以同时对新行和整个表进行排序?例如:
create table positional_order (
  num number,
  txt varchar2(10)
);

现有表格

row 1   (3, 'three' );
row 2   (4, 'four' );

插入新行
row 3   (1, 'one');

插入后

表格变为

row 1   (1, 'one');
row 2   (3, 'three' );
row 3   (4, 'four' );

这个可行吗?

还是我需要先将行插入表中,然后执行 select order by ?

顺便说一下,我正在使用sqlite。

谢谢,

4个回答

7
据我所知,在任何标准的SQL数据库中,插入行到特定位置并不是其功能之一。数据库的工作是确定如何逻辑存储行。正如你所说,排序行的时间是在使用ORDER BY时进行的。
如果你担心性能问题,请在“number”列上创建一个索引。有关索引的更多信息请参见这里

5
简短回答:表是集合,没有顺序。
长回答:聚集索引是最接近的,但即使这样也不是非常准确——如果没有按顺序排列,查询引擎可以自由地以任何它认为最好的顺序返回结果。聚集索引意味着仅查询该表时,查询通常会按照索引定义的顺序返回行,但不要指望它一定会这样做。所有索引都定义了一个顺序,聚集索引定义了磁盘上记录的顺序,虽然这并不能保证您的结果以任何特定的顺序返回,但在大多数情况下很可能会这样。但是,在除了自动生成/递增的列之外的任何地方使用聚集索引之前,请仔细考虑。如果您插入具有聚集索引的表,则必须重新定位磁盘上的记录,这是一项昂贵的操作。

聚集索引非常好!不幸的是,SQLite 不支持聚集索引。他们只能通过创建表 wibble2 并从 wibble 中选择所有内容来实现: 删除 wibble 表中所有数据; 插入 wibble2 表中按键值排序后的所有数据到 wibble 表; 删除 wibble2 表。 - johnsam
@user965229:它可能不支持聚集索引,但它支持索引。查找create index。正如我所说,如果您需要定义的顺序,无论如何都必须使用order by。 - jmoreno
有了索引定义,当我运行 select order by 时,数据库将避免从头开始进行排序。它应该只是根据索引指针返回行。即使我处理数百万行,我也应该在查询中立即获得响应。这样正确吗?谢谢。 - johnsam
@user965229:大致上是这样的。但是如果没有使用order by,就不能保证顺序。但是如果有一个覆盖索引,那么你得到的顺序很可能就是这个索引的顺序。如果你使用了order by,那么它需要做的工作会更少,因为结果已经被预先排序了。 - jmoreno
SQLite确实支持聚集索引,从版本3.8.2(2013-12-06)开始:https://sqlite.org/withoutrowid.html - Dmitry z

1

不可能的,SQL表中的数据默认情况下实际上并没有被“排序”。您需要在应用程序中使用ORDER BY子句以按照您想要的顺序获取结果。


0

我认为这不可能,但您不应该需要这样做;正如您所说,您可以通过 order by 操作或在 num 列上定义索引来完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接