2012-06-25 10 views
5

私はすべてが正しい方法で行われたことを確認したいと思います。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 
+1

おそらく列の一部がどこヌルので、カウントされませんでした...あなたが変数を使用しなければならない理由です、次の挿入前last_insert_rowid()の値を保存マスト?あなたはそれを解決しましたか?私はあなたのソリューションに興味があります。 – cybork

+0

私のソリューションをテストしましたか? –

答えて

1

)が、私はよく分からない場合は、raw_logへの挿入のためのIDを取得するにはIFNULLを使用する必要がありますので、あなたは、競合上のIDを取得します。
あなたは、カウントを行うとき

CREATE TEMP TABLE IF NOT EXISTS _Variables (Name TEXT PRIMARY KEY, Value TEXT); 
... 
INSERT OR IGNORE INTO app(value) VALUES(NEW.app); 
INSERT OR REPLACE INTO _Variables(Key, Value) VALUES('app_id', ifnull((SELECT app.id from app where app.value = NEW.app), last_insert_rowid()); 
... 
INSERT INTO raw_log(app_id, secret_id, ... x 10) 
values((SELECT Value FROM _Variables WHERE Key = 'app_id') 
, (SELECT Value FROM _Variables WHERE Key = 'secret_id'), ... x 10); 
END;