文章目录

        支持 UPDATE FROM 语句
        数据库文件最大支持 281 TB
        PRAGMA integrity_check 语句增强
        decimal 插件
        ieee754 插件增强
        命令行工具增强
        查询计划改进
        WAL 索引文件恢复
        总结

今天给大家带来一个关于 SQLite 嵌入式数据库的最新消息,SQLite 开发团队于 2020 年 8 月 14 日发布了 SQLite Release 3.33.0 版本。本文就来给大家分析一下这个版本中的一些新特性。
支持 UPDATE FROM 语句

UPDATE FROM 语句是针对 SQL 标准的一个扩展,允许使用其他表中的数据更新目标表。通过 UPDATE FROM 语句可以将目标表和数据库中的其他表进行连接,确定需要更新的数据行以及更新后的字段值。

SQLite 中的 UPDATE FROM 语句使用 PostgreSQL语法。假设有一个销售应用程序,SALES 表存储了产品每天的累积销售。在每天销售结束后,需要根据每天的销售情况更新 INVENTORY 库存表;为此,可以基于每天的累积销量更新 INVENTORY 表中的库存数量。例如:

UPDATE inventory
   SET quantity = quantity - daily.amt
  FROM (SELECT sum(quantity) AS amt, itemId FROM sales GROUP BY 2) AS daily
 WHERE inventory.itemId = daily.itemId;

FROM 子句中的子查询按照不同的 itemId 计算销售的数量,然后将它和 inventory 表进行连接并更新 inventory 表中的库存数量。

更新的目标表不在 FROM 子句中,除非是执行自连接查询。此时,FROM 子句中的表必须使用别名和目标表进行区分。

如果连接操作导致目标表中的同一数据行返回多行结果,只更新其中的随机一行结果。例如:

UPDATE department d
   SET d.manager = e.emp_id
  FROM (SELECT dept_id, emp_id FROM employee) AS e
 WHERE d.dept_id = e.dept_id;


一个部门可能存在多名员工,子查询 e 中的每个部门编号对应多个 emp_id,最终部门的 manager 可能是该部门中的任意员工。
数据库文件最大支持 281 TB

每个数据库由一个或多个数据页组成,一个数据库内的所有数据页大小都相同,但是不同的数据库可以使用不同的数据页大小,范围从 512 到 65536 字节。

从 SQLite 3.33.0 开始,一个数据库文件最多使用 4294967294 个数据页(由 max_page_count 编译指令决定),意味着最大支持约 2.8e+14 字节(281 TB)。

由于开发人员没有能够达到该限制的硬件,因此没有对这个上限进行测试。但是,测试验证了 SQLite 在数据库达到底层文件系统的最大文件大小(通常比该限制小得多)和磁盘空间耗尽而导致数据库无法增长时仍然能够正确且稳定地运行。
PRAGMA integrity_check 语句增强

PRAGMA integrity_check 语句现在可以选择性地针对单个表及其索引进行完整性检查,而不仅仅是针对整个数据库文件。

PRAGMA schema.integrity_check;
PRAGMA schema.integrity_check(N)
PRAGMA schema.integrity_check(TABLENAME)

默认情况下针对整个数据库文件进行检查。如果指定了 TABLENAME 参数,则只会针对该表和相关索引进行检查,也就是“部分完整性检查”。

由于只检查了数据库的部分内容,可能无法检测出某些错误,例如文件中存在的未使用部分,或者两个或多个表重复使用文件中的相同部分。只有当 TABLENAME 参数为 sqlite_schema 或者它的别名时,部分完整性检查才会验证 空闲列表(freelist)。