SQLiteを学んでいこうという連載の18回目です。前回の記事はこちらになります。
前回は、ビューの使いどころについて考えてみました。
今回は複数のデータベースの取り扱いです。ここまでご紹介した例は、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の機能であるトリガーについて学びます。いったいどんな機能なんでしょうか?お楽しみに!!