2021年10月2日土曜日

SQLite3 同時に複数のデータベースファイルを操作する (ATTACH/DETACH)

概要

SQLiteでは1ファイルを1データベースとして扱う。 複数のデータベースを同時に操作する場合、 まず一つ目のデータベースファイルに接続し、 二つのデータベースファイルをアタッチ(接続)する。 使用後はデタッチ(切り離し)すればいい。

構文

データベースをアタッチ(接続)する


attach database database_path as alias_name;
                

データベースをデタッチ(切り離し)する


detach alias_name;
                

仕様

アタッチするデータベースには別名をつけておき、 selectやinsertを利用する際は「別名.テーブル名」でアクセスする。 最初に接続したデータベースは「main.テーブル名」でアクセスする。 テーブル名だけでもアクセス出来るが、同じテーブル名が別々のデータベースにあった場合 どちらを操作しているかわかりづらくなってしまう。 データベースをデタッチする際も別名を指定する。

同時にアタッチできるデータベースの数は10個。

実行例

2つのデータベースを跨ってテーブルを結合してselectしてみる。

sub sub main main Attach Attach sample1.db sample1.db sample2.db sample2.db id id name name 1 1 tomato tomato 2 2 potato potato 3 3 pumpkin pumpkin product product id id name name 1 1 tomato tomato 2 2 potato potato 4 4 cassava cassava product product Connect Connect User User Viewer does not support full SVG 1.1
実行環境
  • Windows 10 64bit
  • SQLite3 (3.36.0) Command-Line Shell

C:\temp>rem # 1. 
C:\temp>sqlite3 ./sample1.db
SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.

sqlite> -- # 2.
sqlite> attach database "./sample2.db" as sub;

sqlite> -- # 3.
sqlite> .databases
main: C:\temp\sample1.db r/w
sub: C:\temp\sample2.db r/w

sqlite> .headers on
sqlite> .mode box

sqlite> -- #4.
sqlite> select
   ...>     main.product.id     as id_1
   ...>     , main.product.name as name_1
   ...>     , sub.product.id    as id_2
   ...>     , sub.product.name  as name_2
   ...> from
   ...>     main.product
   ...> left join
   ...>     sub.product
   ...>     on
   ...>         main.product.id = sub.product.id
   ...> ;
┌──────┬─────────┬──────┬────────┐
│ id_1 │ name_1  │ id_2 │ name_2 │
├──────┼─────────┼──────┼────────┤
│ 1    │ tomato  │ 1    │ tomato │
│ 2    │ potato  │ 2    │ potato │
│ 3    │ pumpkin │      │        │
└──────┴─────────┴──────┴────────┘

sqlite> -- # 5.
sqlite> detach sub;
sqlite> .databases
main: C:\temp\sample1.db r/w
                
  1. sample1.db に接続する。
  2. sample2.db を別名subでアタッチする。
  3. コマンドラインツールであれば接続しているデータベースを「.databases」で確認できる。
  4. sample1.db の user テーブルとsample2.db の user テーブルを結合して取得する。
  5. sample2.db をデタッチする。

insert、update、delete なども使えるので サブクエリ等を上手く使えば2つのデータベース間でデータのやり取りが出来る。

同時にアタッチできるデータベースの数は10個

10個以上アタッチしようとすると「Error: too many attached databases - max 10」というエラーが出る。


    sqlite> .databases
    main: C:\temp\sample0.db r/w
    sub1: C:\temp\sample1.db r/w
    sub2: C:\temp\sample2.db r/w
    sub3: C:\temp\sample3.db r/w
    sub4: C:\temp\sample4.db r/w
    sub5: C:\temp\sample5.db r/w
    sub6: C:\temp\sample6.db r/w
    sub7: C:\temp\sample7.db r/w
    sub8: C:\temp\sample8.db r/w
    sub9: C:\temp\sample9.db r/w
    sub10: C:\temp\sample10.db r/w
    
    sqlite> attach database "./sample11.db" as sub11;
    Error: too many attached databases - max 10
                

参考URL