SQLele資料集
そもそもSQLって何? †
素人にとってはそんな所感だったので少し調べてみました。
よってこのページは独断と偏見とにわか知識で構成されてますので識者の方訂正お願いします。
SQLはデータベース処理の為の言語仕様。
SQLiteはそれを実行する為のライブラリ。
そしてSQLeleはSQLiteをHSPから扱う為のモジュール…と。
で、SQLiteはローカルファイルでデータベースを構築するのが特徴なようです。
CSVファイルを扱うような感覚でデータベースを扱える、といった所でしょうか?
シミュレーションやRPGといった大量の定型データを扱うプログラムなら、データベースで効率的に管理できるかも知れません。
ツクール系のデータベースのようなモノを自身で好きなように組み込める、と言えば解る人には解り易そうです。
- ルイーダの酒場
ID | なまえ | 職業 | 性別 | Lv | HP | MP |
---|
1 | ライアン | 戦士 | 男 | 15 | 240 | 0 |
2 | アリーナ | 姫 | 女 | 10 | 160 | 0 |
3 | クリフト | 神官 | 男 | 8 | 120 | 40 |
4 | ブライ | 魔法使い | 男 | 9 | 80 | 65 |
5 | トルネコ | 商人 | 男 | 24 | 220 | 30 |
6 | マーニャ | 踊り子 | 女 | 13 | 115 | 70 |
7 | ミネア | 占い師 | 女 | 12 | 110 | 60 |
ルイーダの酒場というテーブル(表)に、IDやなまえ等のカラム(縦・列)があり、それぞれのレコード(横・行)に各データ(セル・マス目)が並んでいる例です。
1つのデータベース内にこのようなテーブルをいくつも構築できます。
データの構造自体は比較的とっつきやすそうに見えます。
HSPの配列変数とは次のような点で異なると思います。
- 各データのデータ型&サイズは基本的に制限がありません。
同カラム内で異なるデータ型も混在可能です。
- 連想配列のように各カラムの名称は自由に設定可能。
- レコードの追加・削除は容易です。
挿入には少し手間が掛かりますがわざわざ挿入する必要性は薄いです。
- データ内容から取得するレコード・データを選別可能。
またデータ内容でソートした上での取得も簡単です。
- テーブルの一部を切り出したり、複数のテーブルを合成して参照したりと色々できるようです。
- データベースの操作には専用の構文を用いる必要があります。*1
- データベースは別ファイルなので外部からも編集が可能です。*2
作成したデータベースは次回作でも容易に使い回せますw
以降、SQLeleでの利用を前提に基本的な使い方を少し書いてきます。
sql_q "SQL文"
SQLeleでデータベース内を操作する為の命令はこの1つだけです。
他はデータベースファイルを開いたり、データ型の変換やらです。
"SQL文"の部分にSQLiteが理解できる命令を文字列で記述する事で、データベース内の操作の全てを行う事になります。
つまりSQL文を知らなければ何もできません。
この辺がちょっと敷居高くて面倒そうです…
実際使うならデータ内容に合わせてラッパー関数組んだ方が効率的かも知れません。
SQLite用のGUIツール(TkSQLite等)もありますので、静的なデータベースの編集はソチラを利用するのが楽です。
- キーワード(命令語など)の大文字小文字は区別されません。
カラム名なども半角であれば大小区別されませんが、全角アルファベットでは区別されました。
データ内容は大文字小文字きっちり区別されるようです。
- '文字列'等は「'」シングルクォートで括ります。
テーブル名やカラム名も原則的には「'」で括ります。*3
文字列内で「'」を使うには「''」と2つ書きます。'I''m a Cat.'など
- キーワードや指定子などは半角スペース・Tab・改行を挟んで区切ります。
一箇所に何文字入れても1つの区切りとして扱われます。
SQLeleでわざわざTabや改行使う意味は無さそうです。
- SQL文の終端には「;」セミコロンを付けて文を区切ります。
但しSQL文が1つのみなら省略しても問題ありません。
- SQLの文法でなくSQLeleの仕様ですが、
HSPの変数の内容をSQL文に用いる場合はバインド関数(prm_***系)使うべし。とあります。
+
| | SQLの演算子
|
SQLの演算子
( ) | 優先 | + - * / % = | 加算・減算・乗算・除算・剰余・代入 | || | 文字列の連結 (+ではダメ) | << >> | ビット左・右シフト | & | ~ | ビット積・和・否定 (排他:XORは無し) | NOT | 論理否定 | AND | 論理積 | OR | 論理和 | = | 等号 | != <> | 不等号 (!ではダメ) | > < | より大きい・未満 | >= <= | 以上・以下 | IN(a,b,c,..) | どれかと等しいか | BETWEEN a AND b | a〜bの間にあるか | IS NULL | Null値かどうか | IS NOT NULL | Null値以外か | LIKE GLOB | 文字列のあいまい判定 |
|
sql_q "SELECT 取得項目 FROM テーブル名 [WHERE 取得条件] [ORDER BY カラム名];"
[ ]内は省略可能な項目ですよ、と示してるだけで実際[ ]は要りません。
データベース内のデータを取得する為のSQL文はこれ1つです。
編集はGUIツールで行う方が楽ですし、静的な利用であればSELECT文さえ習得すれば可能という事です。
基本形だとこれくらいですが、実際はもっと項目ありますし入れ子のような事もできるので果て無しです。
SQLeleでは取得データはtmparrか、sql_q命令に渡した変数に文字列型配列として格納されます。
配列からのデータの取り出し方はSQLeleのヘルプやサンプルを参照して下さい。
- 取得項目
基本的には、取得したいデータのカラム名を指定します。
「,」区切りで複数のカラム名を列挙すれば、列挙されたカラムのデータを取得します。
また「*」アスタリスクのみは対象テーブルの全てのカラムを指します。
+
| | 少しだけ応用
|
DISTINCT
取得項目指定の前に記述する事で取得済みのレコードと内容が重複するレコードは取得されません。
重複するレコードと見なされるのは、取得データが全て同じレコードのみです。
一部のデータのみ重複といった場合にはGROUP BYというのを使いますがここでは書きません。
テーブルのデータ以外も取得可能
カラム名であれば各レコード内の対応データを返す*4というだけで、値が得られればなんでも取得できます。
「1+1」なら「2」を取得し「Lv*3」ならそれぞれのLvを3倍した値を取得します。
但し、それだけではSQLeleで取り出す際に問題があります。
取得データに別のカラム名を付ける
「項目1 AS 別名1, 項目2 AS 別名2,..」のようにする事で取得時のカラム名を変更できます。
これはSQLeleでもちゃんと有効で、sql_v命令等でのカラム名指定は別名の方を指定する必要があります。
対して別名を付けない場合、取得項目としての指定がそのままカラム名となります。
よって前述の例の問題とは取得時のカラム名が「1+1」や「Lv*3」となっている事です。
|
- FROM テーブル名
基本的には目的のデータが収められたテーブル名を指定するだけです。
応用的には複数のテーブルを結合させたり、SELECT文で取得した結果の中から更に選別したりと色々できるようです。
ちなみに、テーブルからデータを取得するのでなければテーブル指定は要りません。
- WHERE 取得条件
条件式を用いてその条件を満たすレコードのみ取得する為の指定です。
式の中にカラム名を指定すると、各データの内容から判定します。
例えば「WHERE 性別 = '男'」なら男キャラのみ、「WHERE Lv > 10」ならLv11以上のキャラのレコードだけを取得できます。
省略時は無条件という事でテーブル内の全レコードからデータを取得します。
- ORDER BY カラム名
指定されたカラム内のデータを基に、取得するレコードの順番を変更(ソート)します。
あくまで取得レコードの順番を変更するだけで元のテーブルには影響ありません。
省略時はテーブルにレコードが追加された順*5で取得します。
通常は昇順ソートですが「ORDER BY カラム名 DESC」とする事で降順ソート*6になります。
複数カラムを指定した場合は後に指定されたもの程内部ソートの判定基準となります。
+
| | 使用例
|
・使用例
sql_q "SELECT * FROM ルイーダの酒場;"
テーブルのまんま*7取得します。
ID | なまえ | 職業 | 性別 | Lv | HP | MP |
---|
1 | ライアン | 戦士 | 男 | 15 | 240 | 0 | 2 | アリーナ | 姫 | 女 | 10 | 160 | 0 | 3 | クリフト | 神官 | 男 | 8 | 120 | 40 | 4 | ブライ | 魔法使い | 男 | 9 | 80 | 65 | 5 | トルネコ | 商人 | 男 | 24 | 220 | 30 | 6 | マーニャ | 踊り子 | 女 | 13 | 115 | 70 | 7 | ミネア | 占い師 | 女 | 12 | 110 | 60 |
sql_q "SELECT 性別 AS sex,職業 AS class,なまえ AS name FROM ルイーダの酒場 WHERE 性別='男';"
カラム名を変えて男だけ、各カラムは取得項目として記述された順に取得されます。
sex | class | name |
---|
男 | 戦士 | ライアン | 男 | 神官 | クリフト | 男 | 魔法使い | ブライ | 男 | 商人 | トルネコ |
sql_q "SELECT id,なまえ||'さん' AS 名前,職業,性別,Lv,HP*1.5 FROM ルイーダの酒場 ORDER BY 性別,Lv DESC;"
敬称(?)付き、男女別高Lv順、HP1.5倍で取得。
ID | 名前 | 職業 | 性別 | Lv | HP*1.5 |
---|
6 | マーニャさん | 踊り子 | 女 | 13 | 172.5 | 7 | ミネアさん | 占い師 | 女 | 12 | 165.0 | 2 | アリーナさん | 姫 | 女 | 10 | 240.0 | 5 | トルネコさん | 商人 | 男 | 24 | 330.0 | 1 | ライアンさん | 戦士 | 男 | 15 | 240.0 | 4 | ブライさん | 魔法使い | 男 | 9 | 120.0 | 3 | クリフトさん | 神官 | 男 | 8 | 180.0 |
sql_q "SELECT * FROM ルイーダの酒場 WHERE Lv>(SELECT Lv FROM ルイーダの酒場 WHERE なまえ='アリーナ');"
アリーナよりLvが高いキャラ。
( )内のSELECT文で取得したアリーナのLvの値を取得条件の比較式に使ってます。
ID | なまえ | 職業 | 性別 | Lv | HP | MP |
---|
1 | ライアン | 戦士 | 男 | 15 | 240 | 0 | 5 | トルネコ | 商人 | 男 | 24 | 220 | 30 | 6 | マーニャ | 踊り子 | 女 | 13 | 115 | 70 | 7 | ミネア | 占い師 | 女 | 12 | 110 | 60 |
sql_q "SELECT 性別,AVG(Lv)AS 平均Lv,MAX(Lv)AS 最高Lv FROM ルイーダの酒場 GROUP BY 性別;"
男女別Lv調査。
ここに書いた以外にこんな事も出来ますという簡単な例です。
性別 | 平均Lv | 最高Lv |
---|
女 | 11.666666666666666 | 13 | 男 | 14.0 | 24 |
|
sql_q "CREATE TABLE [IF NOT EXISTS] テーブル名 (カラム指定);"
sql_q "DROP TABLE [IF EXISTS] テーブル名;"
CREATE TABLEでデータベース内にテーブルを作成します。
DROP TABLEでデータベースからテーブルを削除します。
- IF NOT EXISTS / IF EXISTS
1つのデータベース内に同名のテーブルを作成する事はできません。
どのテーブルを指定しているのか区別できなくなりますから…
同様に存在しないテーブルを削除する事もできません。
SQLeleにダメ出しされた上にプログラム終了します。
事前にデータベース内を調べてチェックする事もできなくは無いですが、面倒なのでおまじないを使います。
「CREATE TABLE IF NOT EXISTS テーブル名 〜」で同名テーブルが存在していれば作成しません。
「DROP TABLE IF EXISTS テーブル名」でテーブルが存在しなければ削除しません。
- テーブル名
普通にテーブル名を指定するだけですので以下は余談です。
「データベース名.テーブル名」とする事でデータベースを指定してテーブルを作成できます。
但し、データベース名≠データベースファイル名です。
現在のデータベースは「main」、作業用の一時データベースは「temp」というデータベース名で固定です。
ATTACH DATABASE文による追加データベース*8には任意のデータベース名を指定できます。
- (カラム指定)
「カラム名 データ型 カラム制約」の形式でテーブルの初期カラム(項目)を指定します。
複数カラムを指定する時は「,」区切りで必要な分だけ列挙します。
後からカラム追加は簡単ですが、既存カラムの変更・削除は少し手間が掛かります。
同テーブル内でのカラム名の重複は当然不可です。
データ型・カラム制約は必要な分だけ半角スペース区切りで列挙、不用なら省略可能です。
データ型・UNIQUE制約については別ページがあるので他を少しだけ。
- INTEGER PRIMARY KEY
INETEGERはデータ型指定なのですが基本的にワンセットです。
既定値としてテーブル内で重複しない整数を各レコードに割り振ってくれます。
特に操作しなければ、レコードが追加された順に1から順の番号となります。
ソート指定しない時の取得レコードの並びはこの番号順になります。
また、この制約のあるカラムに既存の番号や整数値以外のデータは格納できません。
各レコードを確実に判別する材料となるので有った方が都合が良さそうです。*9
- DEFAULT 既定値
データ未設定時の初期値を指定できます。
省略時はNull値*10が既定値みたいです。
sql_q "CREATE VIEW [IF NOT EXISTS] ビュー名 AS SELECT 〜;"
sql_q "DROP VIEW [IF EXISTS] ビュー名;"
テーブル関連なのでついでに。
ビューとは参照専用の仮想テーブルのようなものです。
SELECT文で取得した内容を保持して置いたり、その中からさらに絞り込むといった用途に使えるかも知れません。
「CREATE TABLE テーブル名 AS SELECT 〜;」とすれば同じ手法で新規にテーブルを作る事もできますが、ビューにはテーブルとは異なる特徴があります。
- 基本的にビューから各データを操作することはできません。
- 基のデータに変更があった場合、ビュー内のデータにもその変更は反映されます。*11
作成後はSELECT文でテーブル名としてビュー名を指定すれば、テーブル同様に参照可能です。
既存のテーブルから特定のレコードやデータを何度も参照する場合に使えそうな気がします。
+
| | 使用例
|
・使用例
sql_q "CREATE VIEW 戦闘メンバー AS SELECT * FROM ルイーダの酒場 WHERE id IN(6,1,5,3);"
指定IDのキャラを「戦闘メンバー」としてビューに抜き出し。(ダメな管理ですね…)
・戦闘メンバー
ID | なまえ | 職業 | 性別 | Lv | HP | MP |
---|
1 | ライアン | 戦士 | 男 | 15 | 240 | 0 | 3 | クリフト | 神官 | 男 | 8 | 120 | 40 | 5 | トルネコ | 商人 | 男 | 24 | 220 | 30 | 6 | マーニャ | 踊り子 | 女 | 13 | 115 | 70 |
sql_q "DROP TABLE IF EXISTS ルイーダの酒場;"
一旦削除します。
IF EXISTSがあるのでテーブルが存在しなくてもエラーにはなりません。
sql_q "CREATE TABLE ルイーダの酒場 (ID INTEGER PRIMARY KEY,なまえ,職業,性別,Lv INTEGER DEFAULT 1,HP,MP);"
作成直後はレコードが1つもありません。
IDにはINTEGER PRIMARY KEY制約を付けてあるので、同性同名同職業であってもキャラを判別するのに利用できます。
|
追加・削除はレコード単位、変更は主にデータ単位で行います。
sql_q "INSERT INTO テーブル名 [(カラム指定)] VALUES (データ指定);"
新しいレコードは、基本的にテーブルの末尾(一番下)に追加されます。
- テーブル名
既存のテーブル名を指定します。
自動でテーブル作成してくれる程面倒見良く無いです。
- (カラム指定)
レコード追加と同時にデータを設定するカラムを「,」区切りで列挙します。
ここで指定されなかったカラムのデータは既定値の状態でレコードが追加されます。
また存在しないカラム名を指定すると当然エラーです。
( )ごと省略するとテーブル内の全てのカラムを指定した事になります。
INTEGER PRIMARY KEY制約のカラムは除外しておくのが無難です。
- VALUES (データ指定)
カラム指定での個数分、指定順にデータを「,」区切りで列挙します。
カラム指定の個数とデータの個数が異なればエラーとなります。
順番を間違ってもデータがあべこべになるだけの事です。
カラム指定省略時は全カラム分のデータを列挙する必要があります。
- SELECT 〜
上記の「VALUES (データ指定)」の代りにSELECT文をそのまま突っ込む事もできます。
カラム数と取得データ数は一致する必要が有る、カラム指定順に取得データが格納される点は同様ですが、SELECT文では取得した分のレコードが一気に追加されます。
同形態のテーブル間でのやり取りには便利かも知れません。
sql_q "UPDATE テーブル名 SET カラム名=データ [WHERE 変更条件];"
変更しようとするデータ値がカラム制約に反する場合*12はエラーとなります。
対してデータ型の違いは黙認してくれます。
- テーブル名
そのまんまです。
- カラム名=データ
どのカラムの値をどんな内容に変更するか、です。
データとして指定できるのは単純な数値や文字列のみで無く、式やSELECT文も指定可能です。
式内のカラム名は、それぞれのレコード内の現在のデータ値となります。
「Lv=Lv+1」とすればLvが1増え、「HP=CAST(HP*0.95 AS INTEGER)」とすればHPが約95%になります。
また「カラム1=データ1, カラム2=データ2,...」のように「,」区切りで列挙する事で一度に複数のデータを変更可能です。
- WHERE 変更条件
テーブル内のどのレコードの値を変更するのか、という条件の指定です。
条件に該当するレコードが無ければ一切変更されません。
省略時はテーブル内の全てのレコードのデータが同様に変更されます。
sql_q "DELETE FROM テーブル名 [WHERE 削除条件];"
テーブルから該当レコードを削除します。
- テーブル名
- WHERE 削除条件
テーブル内のどのレコードを削除するか、という条件の指定です。
条件に該当するレコードが無ければ削除は行われません。
省略時はテーブル内の全レコードを削除されます。
+
| | レコード削除後のINTEGER PRIMARY KEY
|
レコード削除後のINTEGER PRIMARY KEY
自動的に番号を詰めるような事はしません。
削除されたレコードの番号はそのまま欠番となります。
欠番の扱いがどうなるかは状況によって異なります。
そもそものINTEGER PRIMARY KEYの働きとして、INSERT時にデータ指定されてなければ、テーブル内で最大の番号+1をデータとして格納する。という挙動みたいです。
ですので欠番がテーブル内の番号より大きければ再使用されますし、欠番以上の番号が存在していれば自動的に使われる事はありません。
レコード削除=>欠番でレコード追加、でレコード単位の初期化として扱う為の仕様なのでしょうか?
但し、INTEGER PRIMARY KEY制約に加えAUTO INCREMENT指定がある場合、状況に関らず欠番は再使用されなくなるそうです。
|
+
| | 使用例
|
・使用例
sql_q "INSERT INTO ルイーダの酒場 (なまえ,職業) VALUES ('ああああ','勇者');"
勇者「ああああ」追加。
IDはINTEGER PRIMARY KEY制約で自動的に8、Lvは規定値の1になります。
ID | なまえ | 職業 | 性別 | Lv | HP | MP |
---|
1 | ライアン | 戦士 | 男 | 15 | 240 | 0 | 2 | アリーナ | 姫 | 女 | 10 | 160 | 0 | 3 | クリフト | 神官 | 男 | 8 | 120 | 40 | 4 | ブライ | 魔法使い | 男 | 9 | 80 | 65 | 5 | トルネコ | 商人 | 男 | 24 | 220 | 30 | 6 | マーニャ | 踊り子 | 女 | 13 | 115 | 70 | 7 | ミネア | 占い師 | 女 | 12 | 110 | 60 | 8 | ああああ | 勇者 | | 1 | | |
sql_q "UPDATE ルイーダの酒場 SET Lv=Lv+1,性別='♂' WHERE 性別='男';"
男全員Lvアップ、性別表記変更。
ID | なまえ | 職業 | 性別 | Lv | HP | MP |
---|
1 | ライアン | 戦士 | ♂ | 16 | 240 | 0 | 2 | アリーナ | 姫 | 女 | 10 | 160 | 0 | 3 | クリフト | 神官 | ♂ | 9 | 120 | 40 | 4 | ブライ | 魔法使い | ♂ | 10 | 80 | 65 | 5 | トルネコ | 商人 | ♂ | 25 | 220 | 30 | 6 | マーニャ | 踊り子 | 女 | 13 | 115 | 70 | 7 | ミネア | 占い師 | 女 | 12 | 110 | 60 | 8 | ああああ | 勇者 | | 1 | | |
sql_q "DELETE FROM ルイーダの酒場 WHERE ID<4;"
ID4未満退場。
ID | なまえ | 職業 | 性別 | Lv | HP | MP |
---|
4 | ブライ | 魔法使い | ♂ | 10 | 80 | 65 | 5 | トルネコ | 商人 | ♂ | 25 | 220 | 30 | 6 | マーニャ | 踊り子 | 女 | 13 | 115 | 70 | 7 | ミネア | 占い師 | 女 | 12 | 110 | 60 | 8 | ああああ | 勇者 | | 1 | | |
|
まずトランザクションとは何かですが、HSPだとちょうど良い例えがあります。
Redraw0にしてから色々描画処理、全部描画し終わってからRedraw1で表示すれば描画が速い。
これと使い方が良く似てます。
処理が多いならBEGIN 〜 COMMIT間のトランザクション中にまとめて処理した方が速いという仕組みです。
+
| | 一応トランザクションについて
|
データベース本来の性質上、通常は読取モード(?)でデータに変更を加える時だけトランザクション状態に移行します。
トランザクション状態が実際どんなのか解りませんが、そういうものらしいです。
普段そんな事に一切触れなくてもデータの変更を行えるのは、変更を行う時は内部でトランザクションの開始&終了を自動的に行ってくれてるからです。
但しこれは各SQL文毎に切り替えの処理が行われる為、大量の処理を行う場合には処理速度の低下を招きます。
なので一連の処理中はトランザクション状態のままにしておき、全部終わってからトランザクションを終了させようという事です。
具体的な方法は、事前にマニュアル操作でトランザクション開始しとくだけです。
但し、この場合トランザクション終了もきっちりマニュアルで行う必要があります。
恐らくトランザクション状態のままだとデータベースは非常に不安定です。
2,3個程度の処理であってもマニュアルで切り替えた方が速くはなるハズです、殆ど差が無いだけで…
|
sql_q "BEGIN [TRANSACTION];"
sql_q "COMMIT [TRANSACTION];"
sql_q "END [TRANSACTION];"
sql_q "ROLLBACK [TRANSACTION];"
TRANSACTION句は全て省略可能です。付けても別段意味はありません。
- BEGIN
マニュアル操作でのトランザクション開始宣言です。
既にトランザクション中の場合エラーとなります。トランザクションの入れ子(ネスト)はできません。
「BEGIN」の代りに「SAVEPOINT hoge」などとすると、既にトランザクション中ならそのまま続行、トランザクション中でなければ開始してくれます。
SAVEPOINTの本来の用途からは外れてますけど。
- COMMIT / END
処理内容を確定してトランザクションを終了します。
ENDはCOMMITの別名なだけで全く同じものです。
トランザクション中でなければエラー出されます。
- ROLLBACK
処理内容を撤回してトランザクションを終了します。
文字通りの巻き戻しです、データベースの状態はトランザクション開始前の状態に戻ります。
変更中に不味い事態が発覚したら使うのでしょうか?
・使用例
hantei=0 : sql_q "BEGIN;" ;トランザクション開始
Repeat
; 〜なんか大量のデータベース処理〜
; 状況判断して hanteiの値変更[1:正常終了 -1:非常事態宣言]
If hantei!=0 {Break}
Loop
If hantei=1 {sql_q "COMMIT;"} else {sql_q "ROLLBACK;"}
;こんな感じなんでしょうか?
sql_q "VACUUM;"
sql_q "REINDEX;"
動的にデータベースを扱うプログラムならセットでやっとくと累積操作による処理速度の低下を予防できそうです。
Windowsのデフラグのようなものです。
- VACUUM
通常テーブルやレコードが追加される際、データベースの使用領域はその使用に合わせて拡張されます。
しかしテーブルやレコードが削除され空き領域となっても使用領域が縮小される事はありません。
これは後にテーブルやレコードの追加があった場合、その空き領域を再利用する事で領域確保処理の軽減を計る為の仕様です。
ですがデータベースの操作を続けるうちに断片化された空き領域が蓄積し、全体の処理速度の低下を招く事があります。
その様な時にVACUUMで空き領域を一掃する訳です。
但しVACUUM自体それなりに処理時間が掛かります*13ので、DELETEやDROP毎に行うのは本末転倒です。
また、この場合の使用領域=ファイル領域ですので":memory:"などのメモリ上のデータベースには効果無いようです。
- REINDEX
インデックスを再構築する事で探索処理の効率化を計る機能らしいです。
システムインデックスも再構築されるようですので、CREATE INDEXによるインデックスを使用してなくてもやっといて損は無いと思います。
・使用例
*Open_Database
Exist fName :
If strsize<
1 {
Return 0}
If nowDB!="" {sql_q "VACUUM; REINDEX;" : sql_close}
;閉じる前に後片付けしてますが、実際はどっちがいいんでしょ?
sql_open fName : nowDB=fName
Return 1
SQLeleカテゴリーに寄生するヘルプブラウザ用ファイル:poorSQLite.hs