2012-06-25 65 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;   

問題:

通過觸發插入看起來不起作用。 日誌表中的實體數量遠遠小於它應該的數量,而祕密和應用中的實體數量看起來是正確的。

我認爲這是因爲當一個新的應用程序和祕密出現在日誌中。他們可以插入到表中沒有問題。但是,由於這些更改尚未提交,因此以下查詢無法成功引用這些值。

如果是這樣,我該如何解決這些查詢?

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

可能還有一些列的空地方,因此,在做計數時,沒有得到算的?你解決了嗎?我對你的解決方案感興趣。 – cybork

+0

你測試過我的解決方案嗎? –

回答

1

若要插入ID使用last_insert_rowid(),但如果我不知道你得到衝突的ID,所以你必須使用IFNULL獲得ID爲INSERT INTO raw_log。
你肥大省下插入之前last_insert_rowid()的價值,這就是爲什麼你必須使用變量...

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;