我想分析一个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 tablescreate 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 10CREATE 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 10INSERT INTO raw_log(app_ID,secret_ID,.... x 10)select app.ID,secret.ID,x 10from app,x 10where app.value = NEW.app and secret.value = NEW.secret and ... x 10END;
问题:
插入通过触发器看起来不起作用.
日志表中的实体编号远小于应有的数量,而秘密和应用程序中的实体编号看起来正确.
我认为这是因为新的应用程序和秘密出现在日志中.它们可以毫无问题地插入表中.但是,由于尚未提交这些更改,因此以下查询无法成功引用这些值.
如果是这样,我该如何修复这些查询?
INSERT INTO raw_log(app_ID,.... x 10) select app.ID,x 10 from app,x 10 where app.value = NEW.app and secret.value = NEW.secret and ... x 10解决方法 要获取插入的ID,请使用last_insert_rowID(),但如果我不确定您是否在冲突中获得ID,那么您必须使用ifnull来获取插入raw_log的ID.
你在下一次插入之前保存了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,... x 10)values((SELECT Value FROM _Variables WHERE Key = 'app_ID'),(SELECT Value FROM _Variables WHERE Key = 'secret_ID'),... x 10 );END;总结
以上是内存溢出为你收集整理的sqlite将新值插入视图全部内容,希望文章能够帮你解决sqlite将新值插入视图所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)