Eu tenho 2 bancos de dados SQLite com dados comuns, mas com propósitos diferentes, e queria evitar a reinserção de dados. Por isso, fiquei pensando se era possível copiar uma tabela inteira de um banco de dados para outro?
Eu tenho 2 bancos de dados SQLite com dados comuns, mas com propósitos diferentes, e queria evitar a reinserção de dados. Por isso, fiquei pensando se era possível copiar uma tabela inteira de um banco de dados para outro?
Respostas:
Você precisará anexar o Banco de Dados X ao Banco de Dados Y usando o comando ATTACH e , em seguida, execute os comandos Insert Into apropriados para as tabelas que você deseja transferir.
INSERT INTO X.TABLE SELECT * FROM Y.TABLE;
Ou, se as colunas não corresponderem na ordem:
INSERT INTO X.TABLE(fieldname1, fieldname2) SELECT fieldname1, fieldname2 FROM Y.TABLE;
Considere um exemplo em que eu tenho dois bancos de dados, como allmsa.db e atlanta.db. Digamos que o banco de dados allmsa.db tenha tabelas para todas as msas nos EUA e o banco de dados atlanta.db esteja vazio.
Nosso objetivo é copiar a tabela atlanta de allmsa.db para atlanta.db.
ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM;
nota de comando que fornecemos todo o caminho do banco de dados a ser anexado.sqlite> .databases
você pode ver a saída comoarquivo de nome seq --- --------------- -------------------------------- -------------------------- 0 main /mnt/fastaccessDS/core/csv/atlanta.db 2h /mnt/fastaccessDS/core/csv/allmsa.db
INSERT INTO atlanta SELECT * FROM AM.atlanta;
Isso deve servir ao seu propósito.
Maneira mais fácil e correta em uma única linha:
sqlite3 old.db ".dump mytable" | sqlite3 new.db
A chave primária e os tipos de colunas serão mantidos.
.dump
cria o comando CREATE TABLE IF NOT EXISTS ...
e não há erro, mesmo que minha tabela de destino exista.
Para uma ação única, você pode usar .dump e .read.
Despejar a tabela my_table de old_db.sqlite
c:\sqlite>sqlite3.exe old_db.sqlite
sqlite> .output mytable_dump.sql
sqlite> .dump my_table
sqlite> .quit
Leia o dump no new_db.sqlite assumindo que a tabela não exista
c:\sqlite>sqlite3.exe new_db.sqlite
sqlite> .read mytable_dump.sql
Agora você clonou sua mesa. Para fazer isso em todo o banco de dados, simplesmente deixe de fora o nome da tabela no comando .dump.
Bônus: os bancos de dados podem ter codificações diferentes.
Código Objective-C para copiar a tabela de um banco de dados para outro banco de dados
-(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);
}
}
Eu precisava mover dados de um banco de dados compacto do servidor sql para o sqlite, portanto, usando o sql server 2008, você pode clicar com o botão direito do mouse na tabela e selecionar 'Tabela de scripts para' e 'Dados para inserções'. Copie as instruções insert e remova as instruções 'GO' e ela foi executada com êxito quando aplicada ao banco de dados sqlite usando o aplicativo 'DB Browser for Sqlite'.
Primeiro cenário: DB1.sqlite e DB2.sqlite têm a mesma tabela (t1), mas o DB1 está mais "atualizado" que o DB2. Se for pequeno, solte a tabela do DB2 e recrie-a com os dados:
> DROP TABLE IF EXISTS db2.t1; CREATE TABLE db2.t1 AS SELECT * FROM db1.t1;
Segundo cenário: se for uma tabela grande, é melhor você usar uma INSERT if not exists
solução de tipo. Se você tiver uma Unique Key
coluna, é mais direta; caso contrário, você precisará usar uma combinação de campos (talvez todos os campos) e, em algum momento, ainda será mais rápido apenas drop
refazer create
a tabela; é sempre mais direto (menos pensamento é necessário).
A CONFIGURAÇÃO: abra o SQLite sem um banco de dados que crie um banco de dados temporary
na memória e main
, em seguida, attach
DB1.sqlite e DB2.sqlite
> sqlite3
sqlite> ATTACH "DB1.sqlite" AS db1
sqlite> ATTACH "DB2.sqlite" AS db2
e use .databases
para ver os bancos de dados anexados e seus arquivos.
sqlite> .databases
main:
db1: /db/DB1.sqlite
db2: /db/DB2.sqlite
UNIQUE
nem PRIMARY KEY
atribui atributos; portanto, se você os tiver, precisará DROP TABLE
e manualmente CREATE
e / INSERT
ou usará o método.dump
e .read
mencionado acima por @Thinkeye.