2012-06-25 3 views
5

Je voudrais m'assurer que j'ai tout fait correctement.sqlite insérer une nouvelle valeur dans la vue

Il existe un fichier journal 3Gb que je souhaite analyser. Afin d'exécuter toutes les requêtes dans ": memory:" pour booster les performances, je remplace les 10 colonnes de texte par des entiers pour chaque ligne de logs.

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 
); 

et de créer une vue pour la requête et un déclencheur pour insertion.

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;   

questions:

L'insert par déclencheur semble fonctionne pas. Le nombre d'entités dans la table de journal est bien inférieur à ce qu'il devrait être, tandis que le nombre d'entités dans le secret et l'application semble correct.

Je pense que c'est parce qu'une nouvelle application et un secret apparaissent dans le journal. Ils peuvent être insérés dans la table sans problème. Toutefois, puisque ces modifications ne sont pas encore validées, la requête suivante ne peut pas référencer ces valeurs avec succès.

Si oui, comment puis-je résoudre ces requêtes?

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

peut-être quelques-unes des colonnes où et ainsi nulls, lorsque vous faites un compte, n'a pas obtenu compté? l'avez-vous résolu? Je suis intéressé par votre solution. – cybork

+0

avez-vous testé ma solution? –

Répondre

1

Pour obtenir l'utilisation inséré id last_insert_rowid(), mais si je ne suis pas sûr que vous obtenez id sur le conflit, vous devez donc utiliser IFNULL pour obtenir id pour insérer dans raw_log.
Vous MAST enregistrer la valeur de last_insert_rowid() avant insertion suivante, c'est pourquoi vous devez utiliser des variables ...

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; 
Questions connexes