2012-06-25 12 views
5

Me gustaría asegurarme de haber hecho todo correctamente.sqlite insertar nuevo valor en la vista

Hay un archivo de registro 3Gb que quiero analizar. Para ejecutar todas las consultas en ": memoria:" para aumentar el rendimiento, Sustituyo las 10 columnas de texto en identificadores enteros para cada fila de registros.

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

y crear una vista para la consulta y un disparador para la inserción.

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;   

preguntas:

La inserción a través de gatillo no parece funciona. El número de entidades en la tabla de registro es mucho menor de lo que debería ser, mientras que las entidades cuentan en secreto y la aplicación se ve correctamente.

Creo que es porque si bien una nueva aplicación y el secreto aparecen en el registro. Se pueden insertar en la mesa sin problemas. Sin embargo, dado que estos cambios aún no se han confirmado, la siguiente consulta no puede hacer referencia a estos valores correctamente.

Si es así, ¿cómo puedo solucionar esta consulta?

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

posiblemente algunas de las columnas donde los nulos y así, al hacer un recuento, no recibieron mayores contados? ¿Lo resolviste? Estoy interesado en tu solución. – cybork

+0

¿Has probado mi solución? –

Respuesta

1

para conseguir inserta uso Identificación last_insert_rowid(), pero si no estoy seguro ¿Usted consigue ID en conflicto, por lo que debe utilizar para obtener IFNULL Identificación de inserción en raw_log.
Usted mástil guardar el valor de last_insert_rowid() antes de la próxima inserción, por eso debe utilizar 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; 
Cuestiones relacionadas