【发布时间】:2019-12-07 03:21:04
【问题描述】:
reordering columns 在sqlite3 table 中似乎并不简单。至少firefox 中的sqlite manager 不支持此功能。例如,将 column2 移动到 column3 并将 column5 移动到 column2。有没有办法使用 sqlite 管理软件或脚本对 sqlite 表中的列进行重新排序?谢谢。
【问题讨论】:
标签: sqlite
reordering columns 在sqlite3 table 中似乎并不简单。至少firefox 中的sqlite manager 不支持此功能。例如,将 column2 移动到 column3 并将 column5 移动到 column2。有没有办法使用 sqlite 管理软件或脚本对 sqlite 表中的列进行重新排序?谢谢。
【问题讨论】:
标签: sqlite
这在任何 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;
【讨论】:
您可以随时在 SELECT 语句中对列进行排序,如下所示:
SELECT column1,column5,column2,column3,column4
FROM mytable
WHERE ...
您不需要在表格本身中“订购”它们。
【讨论】:
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 移到了它自己的表中,我们的应用很高兴。
【讨论】:
您可以使用 Sqlite Browser 重新排序它们
【讨论】: