【问题标题】:Sqlite3: how to reorder columns in a table?Sqlite3:如何重新排序表中的列?
【发布时间】:2019-12-07 03:21:04
【问题描述】:

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

【问题讨论】:

    标签: sqlite


    【解决方案1】:

    这在任何 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

    【讨论】:

    • 对于上面插入到tabelB的命令,它是否也保留了id?我们需要新表中的记录与 tableA 中的记录具有相同的 id。
    • 当然。如果其中一列是 id,它将被迁移到新表中。
    • @FilipeSilva 如果 ID 列设置为 AUTOINCREMENT 会怎样?
    • 如果其他表的外键引用该表,则必须在删除表之前删除外键引用。检查here
    【解决方案2】:

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

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

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

    【讨论】:

    • 需要匹配 2 个表的模式,以便数据可以从一个表复制到另一个表。 sqlite3导入复制时列不匹配。因此,例如,我们以文本列下的整数列结束。
    【解决方案3】:

    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 移到了它自己的表中,我们的应用很高兴。

    【讨论】:

    • 这很有趣,虽然它根本没有回答问题。
    • 是的。菲利普席尔瓦的回答确实回答了这个问题。我的回答更多是关于为什么确实需要这样做,即验证问题。我们必须这样做,并且没有简单的方法可以更改顺序,因此我们创建了第二个表并将慢列放入该表中。这对我们的性能产生了巨大影响。
    • 确实,答案并没有(直接)回答问题。但这是非常有价值的意见。
    • 我想知道在记录末尾放置长文本列时是否会发生类似的性能差异,以便较小的列不必“跨过”文本列。我只在两个不同的表中用相同的记录运行了一个测试,但是在选择最右边的整数列时没有区别。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-09
      • 2019-09-18
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多