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

问题描述 投票:0回答:9

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

database sqlite
9个回答
198
投票

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

ATTACH DATABASE 'db2.sqlite' as 'Y';
INSERT INTO X.TABLE SELECT * FROM Y.TABLE;
// "INSERT or IGNORE" if you want to ignore duplicates with same unique constraint

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

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

84
投票

单行最简单且正确的方法:

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

主键和列类型将保留。


58
投票

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

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

步骤

  1. sqlite3 atlanta.db(进入 atlanta 数据库)
  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;

这应该符合您的目的。


12
投票

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

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


6
投票

用于将表从一个数据库复制到另一个数据库的 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
投票

最简单的方法是通过 SQLite Studio

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

下载

步骤:

1.添加两个数据库。

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

3.右键点击需要复制的表格,进行复制。

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

现在你完成了


4
投票

第一种情况: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
表格仍然更快;它总是更直接(需要更少的思考)。


设置:打开没有数据库的 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

1
投票

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

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

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.