将数据从一个SQLite数据库复制到另一个

时间:2010-03-01 21:30:34

标签: database sqlite

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

9 个答案:

答案 0 :(得分:157)

您必须使用ATTACH命令将数据库X附加到数据库Y,然后为要传输的表运行相应的“插入到”命令。

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

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

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

答案 1 :(得分:50)

考虑一个例子,我有两个数据库,即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检查数据库列表 你可以看到输出为
  4. seq  name             file                                                      
    ---  ---------------  ----------------------------------------------------------
    0    main             /mnt/fastaccessDS/core/csv/atlanta.db                  
    2    AM               /mnt/fastaccessDS/core/csv/allmsa.db 
    1. 现在你来到你的实际目标。使用该命令 INSERT INTO atlanta SELECT * FROM AM.atlanta;
    2. 这应该符合您的目的。

答案 2 :(得分:38)

在一条线上最简单,最正确的方式:

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

将保留主键和列类型。

答案 3 :(得分:8)

对于一次性操作,您可以使用.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命令中省略表名。

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

答案 4 :(得分:7)

从数据库到另一个数据库的复制表的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);
        }
 }

答案 5 :(得分:0)

我需要将数据从sql server压缩数据库移动到sqlite,因此使用sql server 2008可以右键单击该表并选择“脚本表到”。然后'数据插入'。复制插入语句删除' GO'使用数据库浏览器为Sqlite'应用于sqlite数据库时,语句成功执行应用

答案 6 :(得分:0)

第一种情况: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并重新{{ 1}}表格;它总是更加直截了当(无需思考)。


设置:在没有DB的情况下打开SQlite,该DB在存储器create db中创建temporary,然后在main DB1.sqlite和DB2.sqlite中创建

attach

并使用>sqlite3 sqlite> ATTACHE "DB1.sqlite" AS db1 sqlite> ATTACHE "DB2.sqlite" AS db2 查看附加的数据库及其文件。

.databases

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

最简单的方法是通过 SQLite Studio

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

步骤:

1.添加两个数据库。

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

enter image description here

3.右键单击要复制的表格并复制它。enter image description here

  1. 在要粘贴的数据库上单击鼠标右键,然后粘贴表格。 enter image description here

现在大功告成 enter image description here