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

时间:2013-12-13 19:06:51

标签: sqlite

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

4 个答案:

答案 0 :(得分:23)

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

如果您真的想更改订单,可以这样做:

假设你有tableA:

create table tableA(
col1 int,
col3 int,
col2 int);

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

create table tableB(
col1 int,
col2 int,
col3 int);

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

insert into tableB
SELECT col1,col2,col3 
FROM tableA;

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

DROP table tableA;
ALTER TABLE tableB RENAME TO tableA;

sqlfiddle demo

答案 1 :(得分:8)

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

SELECT column1,column5,column2,column3,column4
FROM mytable
WHERE ...

你不应该"命令"他们在桌子本身。

答案 2 :(得分:4)

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);

用大约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;'

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

我们现在将Blob移到了自己的桌子上,我们的应用程序很高兴。

答案 3 :(得分:0)

您可以使用Sqlite Browser

重新排序