SQLite中使用INSERT INTO...SELECT结合ORDER BY排序表的咨询
刚好做过类似的操作,这个通过临时表中转实现表数据排序的方案是可行的,我帮你整理了正确的实现步骤和代码,顺便修正了原表创建语句里的语法问题(列之间缺逗号会导致创建失败):
整体思路
因为多数SQL数据库(比如你用的SQLite,从语法风格看)不支持直接修改表的物理排序,所以用临时表先承接排序后的数据,再按需处理(要么用临时表直接查询,要么覆盖原表)是常用的办法。
具体实现步骤
1. 先修正原表的创建语句(原语句列间缺少逗号,语法错误)
CREATE TABLE IF NOT EXISTS TRACE_TABLE ( [TRACE_NUM] INTEGER NOT NULL PRIMARY KEY, [TRACE_ID] INTEGER NOT NULL, [TRACE_TIME_DELTA] TEXT NOT NULL, [TRACE_TIME_HEX] INTEGER NOT NULL, [TRACE_TIME_AHB] INTEGER NOT NULL, [TRACE_PARAM_TEXT] TEXT NOT NULL, [TRACE_PARAM_TEXT_DECODED] TEXT );
2. 创建结构完全匹配的临时表
临时表要和原表的列、约束完全一致,避免插入时出现类型或约束冲突:
CREATE TEMP TABLE IF NOT EXISTS TRACE_TABLE_TEMP ( [TRACE_NUM] INTEGER NOT NULL PRIMARY KEY, [TRACE_ID] INTEGER NOT NULL, [TRACE_TIME_DELTA] TEXT NOT NULL, [TRACE_TIME_HEX] INTEGER NOT NULL, [TRACE_TIME_AHB] INTEGER NOT NULL, [TRACE_PARAM_TEXT] TEXT NOT NULL, [TRACE_PARAM_TEXT_DECODED] TEXT );
3. 清空临时表已有数据
确保临时表是干净的,避免旧数据干扰:
DELETE FROM TRACE_TABLE_TEMP; -- 要是用的是MySQL这类支持TRUNCATE的数据库,也可以用TRUNCATE TABLE TRACE_TABLE_TEMP; 效率更高
4. 插入排序后的数据到临时表
这里我假设你要按TRACE_TIME_DELTA升序、TRACE_NUM升序排序,你可以根据需求替换成自己需要的列和排序方向(降序用DESC):
INSERT INTO TRACE_TABLE_TEMP SELECT * FROM TRACE_TABLE ORDER BY TRACE_TIME_DELTA ASC, TRACE_NUM ASC;
可选:把排序后的数据覆盖原表
如果需要让原表的数据也变成排序后的状态,可以执行下面的操作(注意:这会清空原表所有数据,操作前最好备份!):
-- 清空原表 DELETE FROM TRACE_TABLE; -- 将临时表的排序数据插回原表 INSERT INTO TRACE_TABLE SELECT * FROM TRACE_TABLE_TEMP;
注意事项
- 临时表是会话级的:比如SQLite里,关闭数据库连接后临时表会自动删除;MySQL里也是会话结束后消失,所以如果需要长期保存排序后的数据,还是要插回原表或者创建永久表。
- 排序规则可以灵活调整:多列排序用逗号分隔,每列可以单独指定
ASC(升序)或DESC(降序)。
内容的提问来源于stack exchange,提问作者VinayChoudhary99
相关产品推荐
相关产品推荐

