Answers:
您必须使用ATTACH命令将数据库X与数据库Y附加在一起,然后对要传输的表运行适当的“插入到”命令。
INSERT INTO X.TABLE SELECT * FROM Y.TABLE;
或者,如果列不按顺序匹配:
INSERT INTO X.TABLE(fieldname1, fieldname2) SELECT fieldname1, fieldname2 FROM Y.TABLE;
考虑一个示例,其中有两个数据库,即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;
这应该达到您的目的。
一条线上最简单正确的方法:
sqlite3 old.db ".dump mytable" | sqlite3 new.db
主键和列类型将保留。
.dump
创建命令CREATE TABLE IF NOT EXISTS ...
,即使目标表存在也没有错误。
对于一次操作,可以使用.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);
}
}
我需要将数据从sql server紧凑型数据库移动到sqlite,因此使用sql server 2008可以在表上单击鼠标右键,然后选择“脚本表到”,然后选择“数据插入”。复制插入语句可删除“ GO”语句,当使用“用于Sqlite的数据库浏览器”应用程序将其应用于sqlite数据库时,该语句将成功执行。
第一种情况: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
表格还是比较快的。它总是更加简单明了(需要更少的思考)。
设置:在没有创建temporary
内存main
数据库的DB的情况下打开SQLite ,然后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