Small. Fast. Reliable.
Choose any three.
UNION虚拟表
  1. UNION虚拟表(以下称“ union-vtab”)是一个虚拟表,它使多个独立的 rowid表表看起来像一个大表。

  2. 参与工会-vtab的表格可以在同一个数据库文件,也可以是在被单独的数据库文件ATTACH -ed到同一个数据库连接。

  3. union-vtab未内置在SQLite中。Union-vtab是可加载的扩展。union-vtab的源代码包含在 SQLite源树中ext / misc / unionvtab.c的单个文件中 。

  4. 创建一个新的union-vtab实例,如下所示:

    创建虚拟表温度 tabname 使用unionvtab(query );
  5. 每个union-vtab必须在TEMP名称空间中。因此,必须在标签名之前输入“ temp。 ” 。仅要求union-vtab本身位于TEMP名称空间中-被联合的单个表可以是任何ATTACH编写的数据库。

  6. 查询在一个工会vtab创建虚拟TABLE语句必须是一个良好的SQL查询,返回四列和行任意数量。查询结果中的每一行 代表一个要参与联合的表。

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

  8. 查询在第一次遇到CREATE VIRTUAL TABLE语句时运行一次,并且该运行的结果用于所有随后对union-vtab的访问。如果查询的结果发生更改,则应当对union-vtab进行DROP编辑并重新创建,以使查询再次运行。

  9. union-vtab中各个表的rowid范围中不得有任何重叠。

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

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

  12. tabname 的列名和定义将与基础表相同。应用程序可以访问标签名,就像它是真正的基础表之一一样。

  13. union-vtab中的任何表都不能包含查询在CREATE VIRTUAL TABLE语句中建立的rowid范围之外的条目。

  14. 当查询约束位于以下所示形式中时,union-vtab将优化对基础实表的访问。将来可能会优化其他种类的约束,但是在最初的实现中仅会优化这些约束。

    • rowid = $ id
    • rowid IN 查询或列表
    • $ lwr和$ upr之间的rowid

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

  15. union-vtab是只读的。稍后可能会增加对书写的支持,但是书写不是初始实现的一部分。

  16. 诺塔好处:sqlite3_blob_open()接口并没有对工会工作vtab。必须使用普通SQL语句从union-vtab中读取BLOB内容。