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

问题描述 投票:0回答:4

在 SQLite3 表中重新排序列似乎并不简单。至少Firefox中的SQLite Manager不支持此功能。例如,将第 2 列移动到第 3 列,将第 5 列移动到第 2 列。有没有办法使用 SQLite 管理软件或脚本对 SQLite 表中的列重新排序?

sqlite
4个回答
42
投票

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

如果你真的想改变顺序,你可以这样做:

假设你有表A:

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 演示


11
投票

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 之后。

我们现在已将 Blob 移至其自己的表中,我们的应用程序很满意。


10
投票

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

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

您不需要在表格本身中“订购”它们。


2
投票

您可以使用 Sqlite 浏览器

对它们重新排序

右键单击表名称并选择“修改”,您可以在其中对列重新排序。

这里有一个视频展示了如何: https://vimeo.com/899843921/7553e20b2e?share=copy

© www.soinside.com 2019 - 2024. All rights reserved.