【问题标题】:Copying data from one SQLite database to another将数据从一个 SQLite 数据库复制到另一个
【发布时间】:2010-03-01 21:30:34
【问题描述】:

我有 2 个 SQLite 数据库,它们有共同的数据,但用途不同,我想避免重新插入数据,所以我想知道是否可以将整个表从一个数据库复制到另一个数据库?

【问题讨论】:

    标签: database sqlite


    【解决方案1】:

    您必须使用 ATTACH 命令将数据库 X 与数据库 Y 连接,然后为要传输的表运行相应的 Insert Into 命令。

    INSERT INTO X.TABLE SELECT * FROM Y.TABLE;
    

    或者,如果列没有按顺序匹配:

    INSERT INTO X.TABLE(fieldname1, fieldname2) SELECT fieldname1, fieldname2 FROM Y.TABLE;
    

    【讨论】:

    • 另外,如果正在使用 SQLite Expert Personal 程序,它提供了右键单击和 ATTACH 数据库的机会
    • 你需要先创建表!
    • 同名数据库呢?在我的应用程序中,我有一个带有 X 数据的数据库 DB_1 和一个带有 Y 数据的导出/备份数据库 DB_1。如何将备份 DB_1 导入应用程序,以便将 Y 数据添加到 X 数据?到目前为止,我可以从应用程序导出/备份和导入 SQLite 数据库。但是,每次我导入一个导出的,它都会覆盖现有的。因此,我想给我的用户两个选项,要么他们可以导入一个覆盖现有数据库的数据库(这个选项对我有用),要么他们可以只将数据添加到现有数据库而不覆盖。非常感谢。
    • 谢谢!我使用了 Michael D. Irizarry 的回答
    【解决方案2】:

    单行最简单正确的方法:

    sqlite3 old.db ".dump mytable" | sqlite3 new.db
    

    将保留主键和列类型。

    【讨论】:

    • 这很明显......但是如果目标数据库中已经有一个具有该名称的表,则不可能。因此,无法使用该解决方案添加到现有数据(否则很好)
    • @MartinMeeser 问题是关于复制表而不是合并表。您可以尝试通过转储到临时文件、编辑删除 CREATE TABLE 语句的文件并将临时文件用作 new.db 的输入来进行合并。但是可能会发生主键冲突
    • @MartinMeeser,实际上合并工作,如果目标数据库中存在表,您将收到错误消息,但数据将被复制。
    • @MartinMeeser在我安装的SQLite版本(v3.19.3),.dump创建命令CREATE TABLE IF NOT EXISTS ...,即使我的目标表存在也没有错误。
    • 解决问题的简单、UNIX 友好的方法。你值得我投赞成票。谢谢!
    【解决方案3】:

    考虑一个例子,我有两个数据库,即 allmsa.db 和 atlanta.db。假设数据库 allmsa.db 包含美国所有 msas 的表,而数据库 atlanta.db 为空。

    我们的目标是将表 atlanta 从 allmsa.db 复制到 atlanta.db。

    步骤

    1. sqlite3 atlanta.db(进入亚特兰大数据库)
    2. 附加 allmsa.db。这可以使用命令ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM; 来完成 请注意,我们给出了要附加的数据库的完整路径。
    3. 使用sqlite> .databases检查数据库列表 你可以看到输出为
    seq 名称文件
    --- ---------------------------- -------------------------------- --------------------------
    0 主 /mnt/fastaccessDS/core/csv/atlanta.db
    凌晨 2 点 /mnt/fastaccessDS/core/csv/allmsa.db 
    1. 现在你来到了你的实际目标。使用命令 INSERT INTO atlanta SELECT * FROM AM.atlanta;

    这应该符合您的目的。

    【讨论】:

    • 使用'INSERT INTO atlanta SELECT * FROM AM.atlanta;'把事情搞砸了。它复制了所有数据,但交换了一些字段!不要使用它。而是使用已接受答案中的命令,或者更明确地使用:“INSERT INTO X.TABLE(Id, Value) SELECT Id, Value FROM Y.TABLE; 这对我来说很好。
    • @KarimSonbol 唯一的区别是接受的答案传输是从您所在的数据库到附加的数据库完成的,而在这个答案中是相反的。
    • @TulainsCórdova:接受的答案(最后一个变体)意味着它的不同之处在于即使“列未按顺序匹配”也可以工作。你说这不是真的吗?
    【解决方案4】:

    对于一次性操作,您可以使用 .dump 和 .read。

    从 old_db.sqlite 转储表 my_table

    c:\sqlite>sqlite3.exe old_db.sqlite
    sqlite> .output mytable_dump.sql
    sqlite> .dump my_table
    sqlite> .quit
    

    假设表不存在,将转储读入 new_db.sqlite

    c:\sqlite>sqlite3.exe new_db.sqlite
    sqlite> .read mytable_dump.sql
    

    现在您已经克隆了您的表。 要对整个数据库执行此操作,只需在 .dump 命令中省略表名即可。

    奖励:数据库可以有不同的编码。

    【讨论】:

    • 完美,您甚至可以进入转储文件并根据需要进行编辑,例如必要时更改表的名称等。
    【解决方案5】:

    用于将表从数据库复制到另一个数据库的 Objective-C 代码

    -(void) createCopyDatabase{
    
              NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
              NSString *documentsDir = [paths objectAtIndex:0];
    
              NSString *maindbPath = [documentsDir stringByAppendingPathComponent:@"User.sqlite"];;
    
              NSString *newdbPath = [documentsDir stringByAppendingPathComponent:@"User_copy.sqlite"];
              NSFileManager *fileManager = [NSFileManager defaultManager];
              char *error;
    
             if ([fileManager fileExistsAtPath:newdbPath]) {
                 [fileManager removeItemAtPath:newdbPath error:nil];
             }
             sqlite3 *database;
             //open database
            if (sqlite3_open([newdbPath UTF8String], &database)!=SQLITE_OK) {
                NSLog(@"Error to open database");
            }
    
            NSString *attachQuery = [NSString stringWithFormat:@"ATTACH DATABASE \"%@\" AS aDB",maindbPath];
    
           sqlite3_exec(database, [attachQuery UTF8String], NULL, NULL, &error);
           if (error) {
               NSLog(@"Error to Attach = %s",error);
           }
    
           //Query for copy Table
           NSString *sqlString = @"CREATE TABLE Info AS SELECT * FROM aDB.Info";
           sqlite3_exec(database, [sqlString UTF8String], NULL, NULL, &error);
            if (error) {
                NSLog(@"Error to copy database = %s",error);
            }
    
            //Query for copy Table with Where Clause
    
            sqlString = @"CREATE TABLE comments AS SELECT * FROM aDB.comments Where user_name = 'XYZ'";
            sqlite3_exec(database, [sqlString UTF8String], NULL, NULL, &error);
            if (error) {
                NSLog(@"Error to copy database = %s",error);
            }
     }
    

    【讨论】:

      【解决方案6】:

      第一个场景:DB1.sqlite 和 DB2.sqlite 具有相同的表(t1),但 DB1 比 DB2 更“最新”。如果它很小,请从 DB2 中删除该表并使用数据重新创建它:

      > DROP TABLE IF EXISTS db2.t1; CREATE TABLE db2.t1 AS SELECT * FROM db1.t1;
      

      第二种情况:如果是一张大桌子,你最好使用INSERT if not exists 类型的解决方案。如果您有Unique Key 列,则更直接,否则您需要使用字段组合(可能是每个字段),并且在某些时候,仅使用drop 和重新create 表仍然更快;它总是更直接(需要更少的思考)。


      设置:打开没有 DB 的 SQLite,在内存中创建 temporary main 数据库,然后 attach DB1.sqlite 和 DB2.sqlite

      > sqlite3
      sqlite> ATTACH "DB1.sqlite" AS db1
      sqlite> ATTACH "DB2.sqlite" AS db2
      

      并使用.databases 查看附加的数据库及其文件。

      sqlite> .databases
      main: 
      db1: /db/DB1.sqlite
      db2: /db/DB2.sqlite
      

      【讨论】:

      • 注意:这不会保留 UNIQUEPRIMARY KEY 属性,所以如果你有这些,你要么需要 DROP TABLE 并手动 CREATEINSERT 或使用.dump.read method mentioned above @Thinkeye。
      【解决方案7】:

      我需要将数据从 sql server 紧凑型数据库移动到 sqlite,因此使用 sql server 2008 您可以右键单击表并选择“将表写入脚本”,然后选择“要插入的数据”。复制插入语句删除“GO”语句,并在使用“DB Browser for Sqlite”应用程序应用于 sqlite 数据库时成功执行。

      【讨论】:

        【解决方案8】:

        如果您使用DB Browser for SQLite,您可以按照以下步骤将表从一个数据库复制到另一个数据库:

        1. 打开两个应用实例,并排加载源数据库和目标数据库。
        2. 如果目标数据库没有表,从源数据库“复制创建语句”,然后将sql语句粘贴到“执行SQL”选项卡并运行sql创建表。
        3. 在源数据库中,将表导出为 CSV 文件。
        4. 在目标数据库中,将CSV文件导入到同名表中。该应用程序会询问您是否要将数据导入现有表,单击是。完成。

        【讨论】:

          【解决方案9】:

          最简单的方法是通过 SQLite Studio

          如果你没有从https://download.cnet.com/SQLiteStudio/3000-10254_4-75836135.html下载

          步骤:

          1.添加两个数据库。

          2.单击查看选项卡,然后单击数据库,如图所示。

          3.右键你要复制的表,复制它。

          1. 右键单击要粘贴的数据库后粘贴表格。

          现在你已经完成了

          【讨论】:

            猜你喜欢
            • 2014-03-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-06
            相关资源
            最近更新 更多