【问题标题】:SQL append tables with exact same columns but different IDsSQL 追加具有完全相同列但 ID 不同的表
【发布时间】:2014-01-15 21:18:00
【问题描述】:

假设我有数千个表,每个表有 1050 列,它们都在一个数据库中。是否有 SQL 命令将一个 DB 中的所有表追加到一个文件中,并擦除原始表(追加之前)。

即,

myDB 包含 table1、table2、table3 的行数不同,但列名、列类型相同,IDs 列的唯一 ID 不同。

table1
myids,v1,v2,v3
id1,20.3,1.2,3.4
id10,2.1,5.2,9.3
id21,20.5,1.2,8.4
table2
myids,v1,v2,v3
id2,20.3,1.2,3.4
id92,2.1,5.2,9.3
table3
myids,v1,v2,v3
id3,1.3,2.2,5.4
id30,9.1,4.4,9.3

实际示例几乎相同,但列和行更多。

现在我希望我在数据库中的新表是(也是唯一索引的):

mysupertable
myids,v1,v2,v3
id1,20.3,1.2,3.4
id10,2.1,5.2,9.3
id21,20.5,1.2,8.4
id2,20.3,1.2,3.4
id92,2.1,5.2,9.3
id3,1.3,2.2,5.4
id30,9.1,4.4,9.3

我希望从数据库中删除 table1、table2、table3。

作为参考,我使用的是 SQLite3。

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:
    CREATE TABLE mysupertable AS
    SELECT * FROM table1
    UNION 
    SELECT * FROM table2
    UNION
    SELECT * FROM table3;
    
    DROP TABLE table1;
    DROP TABLE table2;
    DROP TABLE table3;
    

    但是,如果有数千个表,则进行联合会很昂贵。最好使用一系列 INSERT:

    CREATE TABLE mysupertable AS
    SELECT * FROM table1;
    DROP TABLE table1;
    
    INSERT INTO mysupertable
    SELECT * FROM table2;
    DROP TABLE table2;
    
    INSERT INTO mysupertable
    SELECT * FROM table3;
    DROP TABLE table3;
    ...
    

    【讨论】:

    • 最好在每个系列中编制索引,还是在最后编制索引?我想为 ID 列创建一个唯一索引。
    • 最好在最后索引它。
    【解决方案2】:
    insert into mysupertable (myids,v1,v2,v3)
    select myids,v1,v2,v3 
    from table1
    

    一遍又一遍……

    insert into mysupertable (myids,v1,v2,v3)
    select myids,v1,v2,v3 
    from table1
    union
    select myids,v1,v2,v3 
    from table2
    

    等等

    【讨论】:

    • 看起来不错,那会删除原件,否则我必须删除 table1、drop table2 等。
    猜你喜欢
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多