Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite3:如何对表中的列重新排序?_Sqlite - Fatal编程技术网

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

Sqlite3:如何对表中的列重新排序?,sqlite,Sqlite,对于sqlite3表中的列重新排序似乎并不简单。至少firefox中的sqlite管理器不支持此功能。例如,将列2移动到列3,将列5移动到列2。有没有办法用sqlite管理软件或脚本对sqlite表中的列重新排序?谢谢。在SELECT语句中,您可以按照自己的意愿对列进行排序,如下所示: SELECT column1,column5,column2,column3,column4 FROM mytable WHERE ... time sqlite3 Catalog.db 'select cou

对于
sqlite3表中的
重新排序似乎并不简单。至少
firefox
中的
sqlite管理器不支持此功能。例如,将列2移动到列3,将列5移动到列2。有没有办法用sqlite管理软件或脚本对sqlite表中的列重新排序?谢谢。

在SELECT语句中,您可以按照自己的意愿对列进行排序,如下所示:

SELECT column1,column5,column2,column3,column4
FROM mytable
WHERE ...
time sqlite3 Catalog.db 'select count(*) from SomeItems where filesize = 2;'
time sqlite3 Catalog.db 'select count(*) from SomeItems where basicscanstatus = 2;'

您不需要在表本身中对它们进行“排序”。

这在任何DBMS中都不是一项简单的任务。几乎可以肯定,您必须创建一个具有所需顺序的新表,并将数据从一个表移动到所需顺序。没有ALTERTABLE语句来对列进行重新排序,因此在sqlite管理器或任何其他地方,都找不到在同一个表中执行此操作的方法

如果您确实想更改订单,可以执行以下操作:

假设你有表格:

create table tableA(
col1 int,
col3 int,
col2 int);
您可以创建一个表格B,其中列按您想要的方式排序:

create table tableB(
col1 int,
col2 int,
col3 int);
然后将数据从表A移动到表B:

insert into tableB
SELECT col1,col2,col3 
FROM tableA;
然后删除原始表格A并将表格B重命名为表格A:

DROP table tableA;
ALTER TABLE tableB RENAME TO tableA;

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);
在表中填充大约20000条记录,其中缩略图是一个小jpeg。然后执行以下两个查询:

SELECT column1,column5,column2,column3,column4
FROM mytable
WHERE ...
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之前,basicscanstatus在Blob之后


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

您可以使用

需要匹配两个表的模式对它们重新排序,以便可以将数据从一个表复制到另一个表。复制时,Sqlite3导入与列不匹配。因此,我们以文本列下的整数列作为结束。对于上面的insert into tabelB命令,它是否也保留了id?我们需要新表中的记录与表A中的记录具有相同的id。如果其中一列是id,它将被迁移到新表。@FilipeSilva如果id列设置为AUTOINCREMENT怎么办?如果其他表的外键引用此表,则必须在删除表之前删除外键引用。检查这是非常有趣的,尽管它根本没有回答问题。是的。菲利佩·席尔瓦的回答确实回答了这个问题。我的回答更多的是关于为什么需要这样做,即验证问题。我们必须这样做,而且没有一种简单的方法来更改顺序,因此我们创建了第二个表,并将slow列放在该表中。这对我们的表现产生了巨大的影响。事实上,答案并没有(直接)回答这个问题。但这是一个非常有价值的输入。我想知道在记录末尾放置长文本列时,是否会出现类似的性能差异,这样较小的列就不必“跨过”文本列。我只在两个不同的表中使用相同的记录运行了一个测试,但在选择最右边的整数列时并没有区别。