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

dzjeubhm  于 2022-12-19  发布在  SQLite
关注(0)|答案(4)|浏览(421)

SQLite3表的列重排序似乎不是很简单,至少Firefox的SQLite管理器不支持这个功能,比如把column2移到column3,把column5移到column2,有没有办法对SQLite表的列重排序,可以使用SQLite管理软件或者脚本?

kyxcudwk

kyxcudwk1#

这在任何DBMS中都不是一个简单的任务。几乎可以肯定的是,你必须创建一个具有你想要的顺序的新表,并将你的数据从一个表移动到这个顺序。没有alter table语句来对列进行重新排序,所以无论是在sqlite管理器中还是在任何其他地方,你都不会找到在同一个表中这样做的方法。
如果确实要更改顺序,可以执行以下操作:
假设您有表A:

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

您可以创建一个表B,其中的列按您想要的方式排序:

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

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

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

然后删除原始表A并将表B重命名为表A:

DROP table tableA;
ALTER TABLE tableB RENAME TO tableA;

SQL小提琴演示

lokaqttq

lokaqttq2#

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

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

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

iqxoj9l9

iqxoj9l93#

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。filesize在Blob之前,basicScanStatus在Blob之后。
现在我们已经将Blob移到了它自己的表中,我们的应用程序运行良好。

x0fgdtte

x0fgdtte4#

你可以使用Sqlite Browser重新排序它们

相关问题