メモなので、実際に試してませんが、SQLite(3)について調べたメモ説明です。
うーん
SQLite を使う分に
メモリで動かせてもお膳立てで時間がかかるのは困るので
メモリに展開されているレコードデータをディスクなどの記憶溶媒へ保存
または
ディスクに置かれているレコードデータをメモリへ展開する。
このどちらかをPHP 返して1レコードづつやってると
とんでもなく時間がかかるのは明白なので
こんなバカげた事はPHP の命令だけで作りたくない。
というか、PHP の命令だけで作るなんていう事をすると
メモリを使っている意味が・・・無くなるw
なので調べてみた所、
ATTACH(ATTACH DATABASE)
というもので、構文が
これは、
ATTACH (DATABASE) expr AS database-name
でした。
なんでこれに気がついたかというと
英語のサイトで
PHP / SQLite - Copying a table from disk to memory
ここにATTACH を使ってテーブルとして読み取っているっぽいのを見つけたから。
うーん・・・
これでも分かりにくくて
日本語のサイトが無いか調べた
あった、クエリーそのままの表現の説明サイト
ALTER TABLE ~テーブル構造を変更する~
ここのサイトの説明の雰囲気では、接続中のデータベースの一部として
他のデータベースからデータを読み書きできるのが AS らしい。
公式マニュアルの
ATTACH(ATTACH DATABASE)
では、expr の部分がやたら色々変えられるのが図式で分かるが
この場合、日本語のマニュアルでは
基本となる接続中???のデータベース名は選択で記述できるが、
まぁ、それは無視するとしても
追加するファイル名と、データベース名が書かれる様だ
ATTACH 追加するファイル名 AS 追加するデータベース名
こんな感じ
それで追加するファイル名は、パスが含まれる場合があるので、
勿論 '中身' で囲んでパス名+ファイル名にしておけばいいのだと思う。
つまり例えば、PDOなら
$pdo = new PDO('sqlite::memory:');
としてメモリを開き、
c:\temp\sqlite.db
というパス名+ファイル名をメモリ上に置きたい場合
$pdo->exec('ATTACH "c:\temp\sqlite.db" as filedb');
としてまず、物理ディスクにある内容c:\temp\sqlite.db を、filedb として
扱える様に定義(この時点で読み込まれるのかは不明、英文読んでないし
メモリの量のテスト
memory_get_usageとかで試してみた訳でない)
そして現在のメモリにテーブルを作って、ディスクの中身に当る
filedb.foo をbar として保存する
$pdo->exec('CREATE TABLE bar AS SELECT * FROM filedb.foo');
また、多分こういうinsertの方法でもいける????
$pdo->exec('insert into bar .table select * from filedb.table');
最後にDROP(要らないならdrop なんだろうけど)でなく、
DETACHで元のテーブルを触る事なく無傷で
テーブルを現在のメモリテーブル操作から切り離す
$pdo->exec('DETACH filedb');
これでいいみたいです???
他にも
2つのSQLiteデータベースを開いて、片方のDBにあるテーブルからもう一方のDBにあ...
とかも同様で参考にしました。
PDO を使った方がいいかなと思いましたが、別にPDO でなくても
クエリーだけの操作ならば問題なくいけるみたいです。
試しては居ませんが、何度も何度も同じ様な疑問を抱き
検索をしているので、この際まとめました。
以上、忘れない為のメモでした。
お粗末<_ _>