web-dev-qa-db-ja.com

あるSQLiteデータベースから別のデータベースへのデータのコピー

共通のデータを使用するが目的が異なる2つのSQLiteデータベースがあり、データの再挿入を避けたいので、あるデータベースから別のデータベースにテーブル全体をコピーできるかどうか疑問に思いましたか?

132

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;
159

Allmsa.dbとatlanta.dbという2つのデータベースがある例を考えてみましょう。データベース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を使用してデータベースリストを確認します。出力は次のように表示されます。
シーケンス名ファイル
 --- --------------- ------------------------ ---------------------------------- 
 0 main/mnt/fastaccessDS/core/csv/atlanta.db 
 AM /mnt/fastaccessDS/core/csv/allmsa.db 
  1. 今、あなたはあなたの実際の目標に来ます。コマンドINSERT INTO atlanta SELECT * FROM AM.atlanta;を使用します

これは目的にかなうはずです。

51
Neeraj Chandak

1行で最も簡単で正しい方法:

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

主キーと列タイプは保持されます。

45
Bernardo Ramos

1回限りのアクションでは、.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コマンドでテーブル名を省略するだけです。

ボーナス:データベースは異なるエンコーディングを持つことができます。

9
Thinkeye

データベースから別のデータベースにテーブルをコピーするための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);
        }
 }
7
avinash

SQL Server Compactデータベースからsqliteにデータを移動する必要があったため、SQL Server 2008を使用してテーブルを右クリックし、[スクリプトテーブル]、[挿入するデータ]の順に選択します。挿入ステートメントをコピーして「GO」ステートメントを削除し、「DB Browser for Sqlite」アプリを使用してsqliteデータベースに適用すると正常に実行されました。

0
Michael Gabay

最初のシナリオ:DB1.sqliteとDB2.sqliteのテーブル(t1)は同じですが、DB1はDB2よりも「最新」です。小さい場合は、DB2からテーブルを削除し、データを使用してテーブルを再作成します。

>DROP TABLE IF EXISTS db2.t1; CREATE TABLE db2.t1 AS SELECT * FROM db1.t1;

2番目のシナリオ:大きなテーブルの場合は、INSERT if not existsタイプのソリューションを使用した方がよい場合があります。 Unique Key列がある場合はより簡単です。そうでない場合は、フィールドの組み合わせ(おそらくすべてのフィールド)を使用する必要があり、ある時点でdropとre -createテーブル。常により簡単です(必要な思考は少なくなります)。


セットアップ:メモリなしでtemporaryを作成するDBなしでSQliteを開くmain db、次にattach DB1.sqliteおよびDB2.sqlite

>sqlite3
sqlite> ATTACHE "DB1.sqlite" AS db1
sqlite> ATTACHE "DB2.sqlite" AS db2

.databasesを使用して、接続されているデータベースとそのファイルを表示します。

sqlite> .databases
main: 
db1: /db/DB1.sqlite
db2: /db/DB2.sqlite
0
Able Mac