2012-06-25 4 views
5

Я хотел бы убедиться, что я сделал все правильно.sqlite добавить новое значение в поле зрения

Существует файл журнала 3Gb, который я хочу проанализировать. Чтобы выполнить все запросы в «: памяти:», чтобы повысить производительность, Я заменяю 10 столбцов текста на целые идентификаторы для каждой строки журналов.

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(), но если я не уверен, что вы получите идентификатор на конфликт, поэтому вы должны использовать IFNULL, чтобы получить идентификатор для вставки в 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; 
Смежные вопросы