【发布时间】:2010-03-01 21:30:34
【问题描述】:
我有 2 个 SQLite 数据库,它们有共同的数据,但用途不同,我想避免重新插入数据,所以我想知道是否可以将整个表从一个数据库复制到另一个数据库?
【问题讨论】:
我有 2 个 SQLite 数据库,它们有共同的数据,但用途不同,我想避免重新插入数据,所以我想知道是否可以将整个表从一个数据库复制到另一个数据库?
【问题讨论】:
您必须使用 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;
【讨论】:
单行最简单正确的方法:
sqlite3 old.db ".dump mytable" | sqlite3 new.db
将保留主键和列类型。
【讨论】:
.dump创建命令CREATE TABLE IF NOT EXISTS ...,即使我的目标表存在也没有错误。
考虑一个例子,我有两个数据库,即 allmsa.db 和 atlanta.db。假设数据库 allmsa.db 包含美国所有 msas 的表,而数据库 atlanta.db 为空。
我们的目标是将表 atlanta 从 allmsa.db 复制到 atlanta.db。
ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM; 来完成
请注意,我们给出了要附加的数据库的完整路径。sqlite> .databases检查数据库列表
你可以看到输出为seq 名称文件 --- ---------------------------- -------------------------------- -------------------------- 0 主 /mnt/fastaccessDS/core/csv/atlanta.db 凌晨 2 点 /mnt/fastaccessDS/core/csv/allmsa.db
INSERT INTO atlanta SELECT * FROM AM.atlanta;
这应该符合您的目的。
【讨论】:
对于一次性操作,您可以使用 .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 命令中省略表名即可。
奖励:数据库可以有不同的编码。
【讨论】:
用于将表从数据库复制到另一个数据库的 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);
}
}
【讨论】:
第一个场景: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
【讨论】:
UNIQUE 和 PRIMARY KEY 属性,所以如果你有这些,你要么需要 DROP TABLE 并手动 CREATE 和 INSERT 或使用.dump 和 .read method mentioned above @Thinkeye。
我需要将数据从 sql server 紧凑型数据库移动到 sqlite,因此使用 sql server 2008 您可以右键单击表并选择“将表写入脚本”,然后选择“要插入的数据”。复制插入语句删除“GO”语句,并在使用“DB Browser for Sqlite”应用程序应用于 sqlite 数据库时成功执行。
【讨论】:
如果您使用DB Browser for SQLite,您可以按照以下步骤将表从一个数据库复制到另一个数据库:
【讨论】:
最简单的方法是通过 SQLite Studio
如果你没有从https://download.cnet.com/SQLiteStudio/3000-10254_4-75836135.html下载
步骤:
1.添加两个数据库。
2.单击查看选项卡,然后单击数据库,如图所示。
【讨论】: