0
点赞
收藏
分享

微信扫一扫

SQLite计算每行插入数据的长度

开源分享 2022-03-18 阅读 58
sqlite

背景:

开发的代理模块负责接收模块的数据进行上报,上报失败需要缓存到数据库中,等待时机重新上报;因此需要缓存模块上报数据,避免数据过大对每个模块的缓存数据设置了大小及数量的限制;因为偷懒不想每次都计算数据大小,所以想直接在插入数据库时自动计算并记录到数据库。

实现方式:

由于没有找到能够直接查询数据大小的方式,所以通过 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

举报

相关推荐

0 条评论