The UNION Virtual Table
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名称空间中 —— 正在联合的单个表可以是任何ATTACH-ed数据库。
6.在针对union-vtab的CREATE VIRTUAL TABLE,其查询必须是一个良好的SQL查询,返回四列和任意数量行。查询
结果中的每一行代表一个参与联合的表。
1. The first column is the schema name for the database that contains the tables. Examples: "main", "zone512".
2. The second column is the name of the table.
3. The third column is the minimum value for any rowid in the table.
4. The fourth column is the maximum value of any rowid in the table.
7.union-vtab的CREATE VIRTUAL TABLE语句的查询
可以是SELECT语句或VALUES子句。
8.当首次遇到CREATE VIRTUAL TABLE语句,并且该单次运行的结果用于对union-vtab的所有后续访问时,该查询
只运行一次。如果查询
结果发生变化,那么应该删除并重新创建union-vtab以使查询
再次运行。
9.union-vtab中的各个表的rowid的band中不能有重叠。
10.参与union-vtab的所有表必须具有相同的CREATE TABLE定义,但表的名称可以不同。
11.所有参与union-vtab的表都必须是rowid表。
12.tabname
的列名和定义将与基础表相同。应用程序可以访问tabname
,就像它是真正的基础表之一一样。
13.union-vtab中的表中不包含CREATE VIRTUAL TABLE语句中由查询
建立的rowid边界之外的条目。
14.当查询的约束条件如下所示时,union-vtab应优化对基础实数表的访问。未来可能会优化其他类型的约束,但在目前的初始实施中,只有这些约束得到优化。
- **rowid=$id**
- **rowid IN** _query-or-list_
- **rowid BETWEEN $lwr AND $upr**
其他类型的约束可能会被使用且有效,但其他约束将会针对每一行单独检查,并且不会被优化(至少不是在最初被优化)。无论优化是否发生,所有约束检查都是完全自动的。本项目中提到的优化只是性能考虑因素。无论查询是否经过优化,都可以获得相同的结果。
15.union-vtab是只读的。以后可以添加对写的支持,但写不是初始实现的一部分。
注意:
sqlite3_blob_open()接口不适用于union-vtab。必须使用普通的SQL语句从union-vtab中读取BLOB内容。
SQLite is in the Public Domain.