UNION 虚拟表(以下简称:“union-vtab”)是一种虚拟表,它使多个独立 的rowid表表看起来像一个单一的大表。
参与 union-vtab 的表可以在同一个数据库文件中,或者它们可以在单独的数据库文件中,这些文件被ATTACH编辑到同一个数据库连接。
union-vtab 没有内置到 SQLite 中。Union-vtab 是一个可加载的扩展。 union-vtab 的源代码包含在SQLite 源代码树中 位于 ext/misc/unionvtab.c的单个文件中。
一个新的 union-vtab 实例创建如下:
创建虚拟表温度。tabname USING unionvtab(查询);
每个 union-vtab 都必须在 TEMP 命名空间中。因此,tabname之前的“ temp. ”是必需的。只有 union-vtab 本身需要位于 TEMP 命名空间中——被联合的各个表可以是任何ATTACH编辑的数据库。
union-vtab 的 CREATE VIRTUAL TABLE 语句中的查询必须是格式正确的 SQL 查询,它返回四列和任意数量的行。查询结果中的每一行 代表一个要参与联合的表。
- 第一列是包含表的数据库的模式名称。示例:“主要”、“zone512”。
- 第二列是表的名称。
- 第三列是表中任何 rowid 的最小值。
- 第四列是表中任意 rowid 的最大值。
union-vtab 的 CREATE VIRTUAL TABLE 语句的查询可以是SELECT语句或VALUES 子句。
当第一次遇到 CREATE VIRTUAL TABLE 语句时,该查询将运行一次,并且该次运行的结果将用于对 union-vtab 的所有后续访问。如果查询结果发生变化,则 union-vtab 应该被DROP编辑并重新创建,以便再次运行查询。
union-vtab 中各个表的 rowid 段不得重叠。
参与 union-vtab 的所有表必须具有相同的 CREATE TABLE 定义,但表的名称可以不同。
参与 union-vtab 的所有表都必须是rowid 表。
tabname 的列名和定义将与基础表相同。应用程序可以访问tabname,就像它是真正的基础表之一一样。
union-vtab 中的任何表都不能包含超出由CREATE VIRTUAL TABLE 语句中 的查询建立的 rowid 范围的条目。
当查询的约束在如下所示的形式中时,union-vtab 应优化对底层真实表的访问。将来可能会优化其他种类的约束,但在最初的实现中只优化了这些约束。
- rowid=$id
- rowid IN 查询或列表
- $lwr 和 $upr 之间的 rowid
可以使用其他类型的约束并且会起作用,但是其他约束将针对每一行单独检查并且不会被优化(至少在最初不会)。无论是否进行优化,所有约束检查都是完全自动的。此要点中提到的优化仅是性能考虑因素。无论查询是否优化,都会获得相同的结果。
union-vtab 是只读的。稍后可能会添加对写入的支持,但写入不是初始实现的一部分。
注意:sqlite3_blob_open()接口不适用于union-vtab 。必须使用普通 SQL 语句从 union-vtab 中读取 BLOB 内容。