Виртуальная таблица UNION
Виртуальная таблица UNION (в дальнейшем: «union-vtab») — это виртуальная таблица, которая позволяет нескольким независимым таблицам с первичным ключом выглядеть как одна большая таблица.
Таблицы, участвующие в union-vtab, могут находиться в одном файле базы данных или в отдельных файлах баз данных, которые подключены к одному соединению базы данных с помощью ATTACH.
union-vtab не является частью SQLite. union-vtab — это загружаемый модуль расширения. Исходный код union-vtab находится в одном файле по адресу ext/misc/unionvtab.c в дереве исходного кода SQLite.
-
Новый экземпляр union-vtab создается следующим образом:
CREATE VIRTUAL TABLE temp.tabname USING unionvtab(query);
Каждая union-vtab должна быть в пространстве имен TEMP. Поэтому перед именем таблицы tabname требуется «temp.». Только сама union-vtab должна находиться в пространстве имен TEMP — отдельные таблицы, которые объединяются, могут быть из любой базы данных, подключенной с помощью ATTACH.
-
Запрос query в операторе CREATE VIRTUAL TABLE для union-vtab должен быть корректным SQL-запросом, возвращающим четыре столбца и произвольное количество строк. Каждая строка в результате выполнения запроса query представляет собой отдельную таблицу, которая должна участвовать в объединении.
- Первый столбец — имя схемы базы данных, содержащей таблицы. Например: «main», «zone512».
- Второй столбец — имя таблицы.
- Третий столбец — минимальное значение первичного ключа (rowid) в таблице.
- Четвертый столбец — максимальное значение первичного ключа (rowid) в таблице.
Запрос query для оператора CREATE VIRTUAL TABLE union-vtab может быть оператором SELECT или операторным клаузой VALUES.
Запрос query выполняется один раз при первом столкновении с оператором CREATE VIRTUAL TABLE, и результаты этого выполнения используются при всех последующих обращениях к union-vtab. Если результаты query изменяются, то union-vtab следует удалить с помощью DROP и создать заново, чтобы запрос query был выполнен снова.
Диапазоны первичных ключей (rowid) различных таблиц в union-vtab не должны перекрываться.
Все таблицы, участвующие в union-vtab, должны иметь одинаковые определения CREATE TABLE, за исключением имен таблиц.
Все таблицы, участвующие в union-vtab, должны быть таблицами с первичным ключом.
Имена и определения столбцов для tabname будут такими же, как и в базовых таблицах. Приложение может обращаться к tabname так же, как к одной из реальных базовых таблиц.
Ни одна таблица в union-vtab не может содержать записи, которые находятся вне границ первичных ключей (rowid), установленных запросом query в операторе CREATE VIRTUAL TABLE.
-
union-vtab должен оптимизировать доступ к базовым реальным таблицам, когда ограничения запроса относятся к формам, представленным ниже. Другие типы ограничений могут быть оптимизированы в будущем, но только эти ограничения оптимизированы в исходной реализации.
- rowid=$id
- rowid IN query-or-list
- rowid BETWEEN $lwr AND $upr
Другие типы ограничений могут использоваться и будут работать, но другие ограничения будут проверяться индивидуально для каждой строки и не будут оптимизироваться (по крайней мере, не изначально). Все проверки ограничений полностью автоматические независимо от того, происходит ли оптимизация. Оптимизация, о которой говорится в этом пункте, является только соображением производительности. Тот же результат получается независимо от того, оптимизируется ли запрос.
union-vtab является только для чтения. Поддержка записи может быть добавлена впоследствии, но запись не является частью исходной реализации.
Примечание: интерфейс sqlite3_blob_open() не работает для union-vtab. Содержимое BLOB необходимо читать из union-vtab с помощью обычных SQL-запросов.
Эта страница была последняя изменена 08.01.2022 05:02:57 UTC
SQLite is in the Public Domain.
https://sqlite.org/unionvtab.html