私はすべてが正しい方法で行われたことを確認したいと思います。sqliteビューに新しい値を挿入
分析したい3Gbログファイルがあります。 パフォーマンスを向上させるために ":memory:"内のすべてのクエリを実行するには、10個のテキスト列を各ログ行の整数IDに置き換えます。
create table if not exists app (
id Integer primary key autoincrement,
value text unique
);
create table if not exists secret (
id integer primary key autoincrement,
value text unique
);
and 10 more tables
create table if not exists raw_log
(
id Integer primary key autoincrement,
app_id INTEGER,
secret_id INTEGER,
and 10 more _id columns
);
を入力して、クエリ用のビューと挿入用のトリガーを作成します。
create view if not exists log as
Select
raw_log.id,
app.value as app,
secret.value as secret,
and 10 more ...
from raw_log, app, secret, ..... x 10
where raw_log.app_id = app_id.id and raw_log.secret = secret.id and ... x 10
CREATE TRIGGER insert_log
INSTEAD OF INSERT ON log
FOR EACH ROW BEGIN
INSERT OR IGNORE INTO app(value) VALUES(NEW.app);
INSERT OR IGNORE INTO secret(value) values(NEW.secret);
... x 10
INSERT INTO raw_log(app_id,secret_id, .... x 10)
select app.id, secret.id, x 10
from app, secret, x 10
where app.value = NEW.app
and secret.value = NEW.secret
and ... x 10
END;
質問:
挿入トリガーを経由して動作しませ見えます。 ログテーブル内のエンティティ番号は、はるかに少なくなりますが、秘密情報とアプリケーション内のエンティティ番号は正しく表示されます。
ログに新しいアプリやシークレットが表示されているのではないかと思います。彼らは問題なくテーブルに挿入することができます。ただし、これらの変更はまだコミットされていないため、次の問合せではこれらの値を正常に参照できません。
もしそうなら、どのようにこれらのクエリを修正できますか? (挿入されたIDの使用last_insert_rowidを取得するために
INSERT INTO raw_log(app_id,secret_id, .... x 10)
select app.id, secret.id, x 10
from app, secret, x 10
where app.value = NEW.app
and secret.value = NEW.secret
and ... x 10
おそらく列の一部がどこヌルので、カウントされませんでした...あなたが変数を使用しなければならない理由です、次の挿入前last_insert_rowid()の値を保存マスト?あなたはそれを解決しましたか?私はあなたのソリューションに興味があります。 – cybork
私のソリューションをテストしましたか? –