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

Leo*_*ues 135 database sqlite

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

Mic*_*rry 164

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

INSERT INTO X.TABLE SELECT * FROM Y.TABLE;
Run Code Online (Sandbox Code Playgroud)

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

INSERT INTO X.TABLE(fieldname1, fieldname2) SELECT fieldname1, fieldname2 FROM Y.TABLE;
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于两个数据库具有相同编码的情况. (8认同)
  • 你需要先创建表! (4认同)
  • 此外,如果 SQLite Expert Personal 程序正在使用,则有机会右键单击并附加数据库 (2认同)

小智 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 您可以查看输出的数据库列表
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;

这应该符合您的目的.

  • 使用'INSERT INTO atlanta SELECT*from AM.atlanta;' 把事搞砸了.它复制了所有数据,但交换了一些字段!不要使用它.而是使用接受的答案中的命令,或者甚至更明确地说:"INSERT INTO X.TABLE(Id,Value)SELECT Id,Value FROM Y.TABLE;这对我来说很好. (2认同)

Ber*_*mos 47

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

sqlite3 old.db ".dump mytable" | sqlite3 new.db
Run Code Online (Sandbox Code Playgroud)

将保留主键和列类型.

  • 我安装的SQLite版本(v3.19.3)中的@ MartinMeeser,`.dump`创建命令`如果不存在则创建表...',即使目标表存在也没有错误。 (2认同)

Thi*_*eye 9

对于一次性操作,您可以使用.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
Run Code Online (Sandbox Code Playgroud)

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

c:\sqlite>sqlite3.exe new_db.sqlite
sqlite> .read mytable_dump.sql
Run Code Online (Sandbox Code Playgroud)

现在你克隆了你的桌子.要对整个数据库执行此操作,只需在.dump命令中省略表名.

额外奖励:数据库可以有不同的编码.


小智 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);
        }
 }
Run Code Online (Sandbox Code Playgroud)


Neh*_*ary 6

最简单的方法是通过 SQLite Studio

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

脚步:

1.添加两个数据库。

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

在此输入图像描述

3.右键单击要复制的表并复制。在此输入图像描述

  1. 右键单击要粘贴的数据库后粘贴表。 在此输入图像描述

现在你完成了 在此输入图像描述