背景:
开发的代理模块负责接收模块的数据进行上报,上报失败需要缓存到数据库中,等待时机重新上报;因此需要缓存模块上报数据,避免数据过大对每个模块的缓存数据设置了大小及数量的限制;因为偷懒不想每次都计算数据大小,所以想直接在插入数据库时自动计算并记录到数据库。
实现方式:
由于没有找到能够直接查询数据大小的方式,所以通过 length() 方法和触发器实现;每次插入数据后,通过触发器去计算插入数据的大小。
例子:
1、创建表
CREATE TABLE report_cache (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
report_data TEXT,
create_time TIMESTAMP DEFAULT (datetime('now', 'localtime') ),
reserve1 BLOB,
row_size INTEGER
);
2、创建触发器
CREATE TRIGGER [trigger_calc_size] AFTER INSERT ON report_cache FOR EACH ROW
BEGIN
UPDATE report_cache SET row_size =
LENGTH(id)+
LENGTH(report_data)+
LENGTH(create_time)+
IIF(LENGTH(Reserve1) IS NULL, 0, LENGTH(Reserve1))
WHERE id = new.id;
END;
注意事项:
(1)LENGTH() 方式返回的是字符串长度,比如说:假设 id 的值是 1,虽然 id 是 INTEGER 类型,但是 LENGTH(id) 返回的值是 1;
(2)BLOB类型的数据,如果值为NULL,那么LENGTH(BLOB字段)+LENGTH(id) 返回的值为空;所以在触发器里对BLOB类型的数据进行了判断;
3、插入数据
INSERT INTO report_cache (report_data) VALUES ("report something");
INSERT INTO report_cache (report_data) VALUES ("report something .");
INSERT INTO report_cache (report_data) VALUES ("report something . .");
4、显示结果
select * from report_cache;
结果输出:
1|report something|2022-03-18 19:27:48||36
2|report something .|2022-03-18 19:29:35||38
3|report something . .|2022-03-18 19:29:39||40