Sqlite3:如何重新排序表中的列?

use*_*363 13 sqlite

似乎reordering columns在a中并不简单sqlite3 table.至少sqlite managerin firefox不支持此功能.例如,将column2移动到column3并将column5移动到column2.有没有办法重新排序sqlite表中的列,使用sqlite管理软件或脚本?谢谢.

Fil*_*lva 24

这在任何DBMS中都不是一项微不足道的任务.您几乎肯定必须创建一个包含所需订单的新表,并将数据从一个表移动到订单.没有alter table语句来重新排序列,所以无论是在sqlite manager还是在任何其他地方,你都找不到在同一个表中执行此操作的方法.

如果你真的想改变订单,你可以这样做:

假设你有tableA:

create table tableA(
col1 int,
col3 int,
col2 int);
Run Code Online (Sandbox Code Playgroud)

您可以创建一个tableB,其列按您希望的方式排序:

create table tableB(
col1 int,
col2 int,
col3 int);
Run Code Online (Sandbox Code Playgroud)

然后从tableA将数据移动到tableB:

insert into tableB
SELECT col1,col2,col3 
FROM tableA;
Run Code Online (Sandbox Code Playgroud)

然后删除原始tableA并将tableB重命名为TableA:

DROP table tableA;
ALTER TABLE tableB RENAME TO tableA;
Run Code Online (Sandbox Code Playgroud)

sqlfiddle demo


BWS*_*BWS 8

您始终可以在SELECT语句中按顺序对列进行排序,如下所示:

SELECT column1,column5,column2,column3,column4
FROM mytable
WHERE ...
Run Code Online (Sandbox Code Playgroud)

您不应该在表格中"订购"它们.


use*_*681 5

sqlite3 中的顺序确实很重要。从概念上讲,它不应该,但尝试这个实验来证明它确实如此:

CREATE TABLE SomeItems (identifier INTEGER PRIMARY KEY NOT NULL, filename TEXT NOT NULL, path TEXT NOT NULL, filesize INTEGER NOT NULL, thumbnail BLOB, pickedStatus INTEGER NOT NULL, deepScanStatus INTEGER NOT NULL, basicScanStatus INTEGER NOT NULL, frameQuanta INTEGER, tcFlag INTEGER, frameStart INTEGER, creationTime INTEGER);
Run Code Online (Sandbox Code Playgroud)

用大约 20,000 条记录填充表格,其中缩略图是一个小 jpeg。然后做几个这样的查询:

time sqlite3 Catalog.db 'select count(*) from SomeItems where filesize = 2;'
time sqlite3 Catalog.db 'select count(*) from SomeItems where basicscanstatus = 2;'
Run Code Online (Sandbox Code Playgroud)

不管返回多少条记录,在我的机器上,第一次查询大约需要 0m0.008s,第二次查询需要 0m0.942s。巨大的差异,原因是因为 Blob;filesize 在 Blob 之前, basicscanstatus 在之后。

我们现在已经将 Blob 移动到它自己的表中,我们的应用程序很高兴。

  • 这很有趣,尽管它根本没有回答问题。 (3认同)
  • 真的。Filipe Silva 的回答确实回答了这个问题。我的回答更多是关于为什么需要这样做,即验证问题。我们不得不这样做,而且没有一种简单的方法可以更改顺序,因此我们创建了第二个表并将慢列放在该表中。这对我们的性能产生了巨大的影响。 (2认同)