5

私はすべてが正しい方法で行われたことを確認したいと思います。

分析したい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;          

質問:

トリガーによる挿入が機能していないようです。ログ テーブルのエンティティ数は本来あるべき数よりもはるかに少なくなっていますが、シークレットとアプリのエンティティ数は正しく見えます。

ログに新しいアプリとシークレットが表示されるためだと思います。問題なくテーブルに挿入できます。ただし、これらの変更はまだコミットされていないため、次のクエリはこれらの値を正常に参照できません。

もしそうなら、どうすればこれらのクエリを修正できますか?

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
4

1 に答える 1