小巧、快速、可靠。
三者选其二。
UNION 虚拟表
  1. UNION 虚拟表(以下简称:union-vtab)是一个 虚拟表,它使多个独立的 rowid 表 看起来像一个大型表。

  2. 参与 union-vtab 的表可以位于同一个数据库文件中,也可以位于连接到同一个数据库连接的单独数据库文件中,这些数据库文件已 附加

  3. union-vtab 不是内置在 SQLite 中。union-vtab 是一个 可加载扩展。union-vtab 的源代码包含在一个文件中,该文件位于 SQLite 源代码树中的 ext/misc/unionvtab.c

  4. 新的 union-vtab 实例创建如下

    CREATE VIRTUAL TABLE temp.tabname USING unionvtab(query);
  5. 每个 union-vtab 必须位于 TEMP 命名空间中。因此,tabname 之前的“temp.”是必需的。只有 union-vtab 本身需要位于 TEMP 命名空间中 - 被联合的单个表可以是任何 附加 的数据库。

  6. union-vtab 的 CREATE VIRTUAL TABLE 语句中的 query 必须是一个格式良好的 SQL 查询,该查询返回四列和任意数量的行。query 结果中的每一行代表一个将参与联合的单个表。

    1. 第一列是包含表的数据库的模式名称。示例:“main”、“zone512”。
    2. 第二列是表名。
    3. 第三列是表中任何 rowid 的最小值。
    4. 第四列是表中任何 rowid 的最大值。
  7. union-vtab 的 CREATE VIRTUAL TABLE 语句的 query 可以是 SELECT 语句或 VALUES 子句

  8. 首次遇到 CREATE VIRTUAL TABLE 语句时运行 query 一次,该运行的结果将用于所有后续对 union-vtab 的访问。如果 query 的结果发生变化,则应 删除 union-vtab 并重新创建,以使 query 再次运行。

  9. union-vtab 中各个表的 rowid 范围之间不能有重叠。

  10. 参与 union-vtab 的所有表都必须具有相同的 CREATE TABLE 定义,但表名可以不同。

  11. 参与 union-vtab 的所有表都必须是 rowid 表

  12. tabname 的列名和定义将与底层表相同。应用程序可以像访问底层真实表一样访问 tabname

  13. union-vtab 中的任何表都不能包含超出 CREATE VIRTUAL TABLE 语句中 query 所建立的 rowid 范围内的条目。

  14. 当查询的约束属于以下形式时,union-vtab 将优化对底层真实表的访问。将来可能会优化其他类型的约束,但只有这些约束在初始实现中得到优化。

    • rowid=$id
    • rowid IN query-or-list
    • rowid BETWEEN $lwr AND $upr

    可以使用其他类型的约束,这些约束也将起作用,但其他约束将针对每一行单独检查,并且不会进行优化(至少最初不会)。无论是否发生优化,所有约束检查都是完全自动的。此要点中提到的优化仅是性能方面的考虑。无论查询是否优化,都会获得相同的结果。

  15. union-vtab 是只读的。将来可能会添加写入支持,但写入不是初始实现的一部分。

  16. 注意: sqlite3_blob_open() 接口适用于 union-vtab。BLOB 内容必须使用普通的 SQL 语句从 union-vtab 中读取。

此页面最后修改于 2022-01-08 05:02:57 UTC