参与工会-vtab的表格可以在同一个数据库文件,也可以是在被单独的数据库文件ATTACH -ed到同一个数据库连接。
union-vtab未内置在SQLite中。Union-vtab是可加载的扩展。union-vtab的源代码包含在 SQLite源树中ext / misc / unionvtab.c的单个文件中 。
创建一个新的union-vtab实例,如下所示:
创建虚拟表温度 tabname 使用unionvtab(query );
每个union-vtab必须在TEMP名称空间中。因此,必须在标签名之前输入“ temp。 ” 。仅要求union-vtab本身位于TEMP名称空间中-被联合的单个表可以是任何ATTACH编写的数据库。
该查询在一个工会vtab创建虚拟TABLE语句必须是一个良好的SQL查询,返回四列和行任意数量。查询结果中的每一行 代表一个要参与联合的表。
该查询在第一次遇到CREATE VIRTUAL TABLE语句时运行一次,并且该运行的结果用于所有随后对union-vtab的访问。如果查询的结果发生更改,则应当对union-vtab进行DROP编辑并重新创建,以使查询再次运行。
union-vtab中各个表的rowid范围中不得有任何重叠。
参与union-vtab的所有表都必须具有相同的CREATE TABLE定义,但表名可以不同。
参与union-vtab的所有表都必须是rowid表。
tabname 的列名和定义将与基础表相同。应用程序可以访问标签名,就像它是真正的基础表之一一样。
union-vtab中的任何表都不能包含查询在CREATE VIRTUAL TABLE语句中建立的rowid范围之外的条目。
当查询约束位于以下所示形式中时,union-vtab将优化对基础实表的访问。将来可能会优化其他种类的约束,但是在最初的实现中仅会优化这些约束。
可以使用其他种类的约束,这些约束将起作用,但是将针对每行单独检查其他约束,并且不会对其进行优化(至少在最初不是这样)。无论是否进行优化,所有约束检查都是完全自动的。本项目要点中提到的优化仅是性能方面的考虑。无论是否优化查询,都将获得相同的结果。
union-vtab是只读的。稍后可能会增加对书写的支持,但是书写不是初始实现的一部分。
诺塔好处: 该sqlite3_blob_open()接口并没有对工会工作vtab。必须使用普通SQL语句从union-vtab中读取BLOB内容。