UNION 虚拟表(以下简称:union-vtab)是一个 虚拟表,它使多个独立的 rowid 表 看起来像一个大型表。
参与 union-vtab 的表可以位于同一个数据库文件中,也可以位于连接到同一个数据库连接的单独数据库文件中,这些数据库文件已 附加。
union-vtab 不是内置在 SQLite 中。union-vtab 是一个 可加载扩展。union-vtab 的源代码包含在一个文件中,该文件位于 SQLite 源代码树中的 ext/misc/unionvtab.c。
新的 union-vtab 实例创建如下
CREATE VIRTUAL TABLE temp.tabname USING unionvtab(query);
每个 union-vtab 必须位于 TEMP 命名空间中。因此,tabname 之前的“temp.”是必需的。只有 union-vtab 本身需要位于 TEMP 命名空间中 - 被联合的单个表可以是任何 附加 的数据库。
union-vtab 的 CREATE VIRTUAL TABLE 语句中的 query 必须是一个格式良好的 SQL 查询,该查询返回四列和任意数量的行。query 结果中的每一行代表一个将参与联合的单个表。
union-vtab 的 CREATE VIRTUAL TABLE 语句的 query 可以是 SELECT 语句或 VALUES 子句。
首次遇到 CREATE VIRTUAL TABLE 语句时运行 query 一次,该运行的结果将用于所有后续对 union-vtab 的访问。如果 query 的结果发生变化,则应 删除 union-vtab 并重新创建,以使 query 再次运行。
union-vtab 中各个表的 rowid 范围之间不能有重叠。
参与 union-vtab 的所有表都必须具有相同的 CREATE TABLE 定义,但表名可以不同。
参与 union-vtab 的所有表都必须是 rowid 表。
tabname 的列名和定义将与底层表相同。应用程序可以像访问底层真实表一样访问 tabname。
union-vtab 中的任何表都不能包含超出 CREATE VIRTUAL TABLE 语句中 query 所建立的 rowid 范围内的条目。
当查询的约束属于以下形式时,union-vtab 将优化对底层真实表的访问。将来可能会优化其他类型的约束,但只有这些约束在初始实现中得到优化。
可以使用其他类型的约束,这些约束也将起作用,但其他约束将针对每一行单独检查,并且不会进行优化(至少最初不会)。无论是否发生优化,所有约束检查都是完全自动的。此要点中提到的优化仅是性能方面的考虑。无论查询是否优化,都会获得相同的结果。
union-vtab 是只读的。将来可能会添加写入支持,但写入不是初始实现的一部分。
注意: sqlite3_blob_open() 接口不适用于 union-vtab。BLOB 内容必须使用普通的 SQL 语句从 union-vtab 中读取。
此页面最后修改于 2022-01-08 05:02:57 UTC