SQL - 更新表并按顺序排序?

4
我是一名有用的助手,可以翻译文本。

所以我有一个无序表格 movement ,它具有列 timestamp x y 。 我想按 timestamp 排序,并更改和保存表格,使所有行按时间戳排序。

我想使用 UPDATE TABLE ,但我不确定查询应该是什么样子的...例如,我有这个:

UPDATE movement 
SET ????? 
ORDER BY timestamp; 

我不想设置任何内容,我只想改变表格的顺序。 我需要为另一个查询编写此操作,但事实是这个表非常大,我需要分步骤进行以避免后续性能问题。那么我该怎么做呢?我找到了this一个类似的SO帖子来解决这个问题,但我想知道是否有其他方法可以做到而不必使用另一个表,因为正如我所说,这个表非常大(数百万行),重新复制表将花费很长时间。

1
虽然这种方式对于“排序”表并没有太多意义,但你可以创建一个虚拟表来存储按排序顺序排列的值。然后删除原始表的内容并将所有内容复制回去,添加一个名为sortorder的附加列,在更新期间使用rownum填充。但问题是,你为什么要这样做呢? - avk
1
有没有使用UPDATE tablename的理由,你能否只创建一个新的有序表,并替换旧表? - Sh4d0wsPlyr
你还可以创建一个“视图”,其中包含按时间戳排序的SQL查询。然后,您可以将此视图引用为表。 - avk
@avk 谢谢,我可能最终会这样做。我想这样做是因为我有另一个查询要在表上实现,使用有序表会更快,因为它将检查所有 timestamp >= 'example timestamp'。或者这个逻辑不正确吗? - ocean800
1
是的和不是。视图仅仅是一种基于业务逻辑模拟表格的简单方法,因此它将查询该视图而不是将其视为表格。你可以研究一下所谓的“物化视图”,它实际上创建了虚拟表格。不幸的是,这也有自己的缺点,比如刷新间隔。 - avk
4个回答

1

表格本质上没有顺序;你不必将它们更新为任何特定的顺序。

你需要做的是选择从表格中选择的顺序。然后它可以按照你选择的任何顺序排列!

示例:

SELECT * FROM movement  
ORDER BY timestamp; 

但是在其他地方,也许你想要这样做:
SELECT * FROM movement  
ORDER BY timestamp DESCENDING; 

1
关系型数据库表代表无序集合。因为表中行的顺序概念不存在,所以没有对表排序的语法。如果您在没有明确指定order by子句的情况下发出查询,数据库可能会以任何它认为合适的顺序返回行,这可能受到它们被插入并写入磁盘的顺序、它们存在于某些内存缓存、索引或一系列其他实现细节的影响。
如果您想按时间戳排序查询表中的行,请在order by子句中明确声明。
SELECT   *
FROM     `movement`
ORDER BY `timestamp`

1

这是MySQL格式,实际上是可以做到的。更新用于编辑已有信息。如果您想进行更直接的更改,请根据语法使用ALTER或MODIFY。

ALTER TABLE movement 
ORDER BY timestamp;

1
无法在 UPDATE 语句中使用 ORDER BYORDER BY 只能与 SELECT 语句一起使用。再次强调,没有必要按照特定顺序存储记录,因为您可以使用 SELECT 语句按特定顺序显示记录。
select * from movement 
order by timestamp

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