複数のデータベース(SQLiteを学ぶ_18)

SQLiteを学んでいこうという連載の18回目です。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、ビューの使いどころについて考えてみました。

今回は複数のデータベースの取り扱いです。ここまでご紹介した例は、1つのデータベースファイル、1つのテーブルについてでした。でも複数のデーベースに渡ってアクセスしたい事もあると思います。

これまでは主にインメモリデータベースを使ってSQLite3の動作を見てきましたが、今回は実際にデータベースファイルを作成して動かし見ましょう。

ファイルの作成と確認

SQLiteでは、起動時にファイル名を指定するとデータベースファイルを作成できます。今回は別の方法で作成してみましょう。ドットコマンドの「.open」を使います。

.open ファイル名

指定したファイル名のデータベースファイルがあると、そのファイルを開きます。ない場合には新しくデータベースファイルを作成します。 開いているデータベースファイルを確認するにはドットコマンドの「.databases」を使います。

sqlite> .open C:/WORK/TEST_1.db
sqlite> .database
main: C:\WORK\TEST_1.db r/w

「main」はデータベース名になります。続いて別の名前でデータベースファイルを作成します。

sqlite> .open C:/WORK/TEST_2.db
sqlite> .database
main: C:\WORK\TEST_2.db r/w

この時に開いているデータベースファイルが変わってしまいますが、以前のデータベースファイルは残っています。

複数のデータベースを開く

複数のデータベースを開くには「attach」を使います。

attach ファイル名 as データベース名;

と記述します。最初に作成したデータベースファイルを「attach」で開き直してみましょう。

sqlite> attach "C:/WORK/TEST_1.db" as sub;
sqlite> .database
main: C:\WORK\TEST_2.db r/w
sub: C:\WORK\TEST_1.db r/w

2つのデータベースファイルが開かれていることが判ります。同時にattach可能なデータベースファイル数は、デフォルトでは10個までです。

テーブルへのアクセス方法

次にテーブルへのアクセス方法ですが、テーブル名を指定するだけで通常と変わりません。それぞれのデータベースファイルに同じテーブル名がある場合は、先に開いたデータベースファイルが選択されます。でも、それだと間違えやすいので先頭にデーベース名をつけてドットで区切ります。attachで複数のデータベースファイルを開いている時には、できるだけデータベース名を付けましょう。

データベース名.テーブル名

上で作成したデータベースファイルにテーブルを設けて、データを追加してみましょう。

sqlite> CREATE TABLE main.sample_1(id INTEGER,name TEXT,age INTEGER);
sqlite> INSERT INTO sample_1 VALUES(1,"TANAKA",25);
sqlite> INSERT INTO sample_1 VALUES(2,"YAMADA",30);
sqlite> INSERT INTO sample_1 VALUES(3,"OOTA",27);
sqlite> SELECT * FROM main.sample_1;
┌────┬──────────┬─────┐
│ id │   name   │ age │
├────┼──────────┼─────┤
│ 1  │ 'TANAKA' │ 25  │
│ 2  │ 'YAMADA' │ 30  │
│ 3  │ 'OOTA'   │ 27  │
└────┴──────────┴─────┘

テーブルが作成されました。データベースファイル内のテーブル一覧を確認したい場合には「sqlite_master」の前に データベース名とドットを記載します。

sqlite> SELECT name FROM main.sqlite_master WHERE type = 'table';
sample_1

同様にもう1つのデータベースファイルにもテーブルを設けて、データを追加します。

sqlite> CREATE TABLE sub.sample_2(id INTEGER,name TEXT,age INTEGER);
sqlite> INSERT INTO sub.sample_2 VALUES(4,"AIHARA",33);

それでは、作成した2つのテーブルを統合してみましょう。

sqlite> SELECT * FROM main.sample_1
   ...> UNION
   ...> SELECT * FROM sub.sample_2;
┌────┬──────────┬─────┐
│ id │   name   │ age │
├────┼──────────┼─────┤
│ 1  │ 'TANAKA' │ 25  │
│ 2  │ 'YAMADA' │ 30  │
│ 3  │ 'OOTA'   │ 27  │
│ 4  │ 'AIHARA' │ 33  │
└────┴──────────┴─────┘

ちゃんと統合できました。この様にattachを使用すれば複数のデータベースファイルを1つのデータベースファイルとして扱うことができるのです。

データベースを閉じる

attachしたデータベースファイルを閉じるには「detach」を使用します。書式は以下の様になります。

detach データベース名;

データベース「sub」を閉じてみましょう。

sqlite> detach sub;
sqlite> .database
main: C:\WORK\TEST_2.db r/w

無事閉じることができました。

次回はトリガー

いかがでしょうか。attach/detachを使用すると複数のデータベースファイルを同時に扱えて便利です。 次回はSQLiteの機能であるトリガーについて学びます。いったいどんな機能なんでしょうか?お楽しみに!!

hirocom777.hatenadiary.org

SQLite学習記事のまとめですはこちらから