gpt4 book ai didi

sqlite 将新值插入 View

转载 作者:IT王子 更新时间:2023-10-29 06:29:55 26 4
gpt4 key购买 nike

我想确保我做的每件事都是正确的。

我想分析一个 3Gb 的日志文件。为了执行“:内存:”中的所有查询以提高性能,我将每行日志的 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
);

并创建用于查询的 View 和用于插入的触发器。

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;

问题:

通过触发器插入看起来不起作用。日志表中的实体编号比应有的少得多,而 secret 实体编号和应用程序看起来正确。

我认为这是因为当一个新的应用程序和 secret 出现在日志中时。它们可以毫无问题地插入到表中。但是,由于这些更改尚未提交,因此以下查询无法成功引用这些值。

如果是这样,我该如何解决这些问题?

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

最佳答案

要获取插入的 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, secret_id, ... x 10)
values((SELECT Value FROM _Variables WHERE Key = 'app_id')
, (SELECT Value FROM _Variables WHERE Key = 'secret_id'), ... x 10 );
END;

关于sqlite 将新值插入 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11182959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com