Создание и заполнение таблицы на основе результатов запроса
Внимание
Поддерживается только для колоночных таблиц. Поддержка функциональности для строковых таблиц находится в разработке.
Вызов CREATE TABLE AS
создает новую таблицу, которая заполнена данными из результатов запроса.
CREATE TABLE table_name (
PRIMARY KEY ( column, ... )
)
WITH ( key = value, ... )
AS SELECT ...
Имена и типы колонок будут соответствовать результатам SELECT
.
Для колонок неопционального типа также будет выставлен модификатор NOT NULL
.
При создании таблицы через CREATE TABLE AS
не поддерживается указание имен колонок, вторичных индексов, векторных индексов, групп колонок. Имена и типы данных для столбцов новой таблицы автоматически наследуются из результирующего набора запроса SELECT. Все вышеперечисленное можно изменять при помощи ALTER TABLE
после создания таблицы. При этом поддерживаются дополнительные параметры.
Особенности
Важно
Запись строк производится с полной перезаписью строки, как при использовании REPLACE INTO
, но при этом отсутствуют гарантии на порядок записи строк в таблицу.
Если SELECT
вернул 2 или более строки с одним и тем же значением первичного ключа, то после завершения выполнения CREATE TABLE AS
в созданной таблице будет только одна запись с таким значением первичного ключа. При этом какая именно из записей найденных в SELECT
будет добавлена - в общем случае не определено.
-
CREATE TABLE AS
поддерживается только в режиме неявного контроля транзакций. Таблица появится по указанному пути уже заполненной. -
CREATE TABLE AS
может быть только единственным DML/DDL выражением в запросе. Допустимо использование PRAGMA, DECLARE и именованных выражений. -
CREATE TABLE AS
не конфликтует с другими транзакциями. При выполнении запроса не используются блокировки, а все чтения производятся из консистентного снапшота. Балансировка или разделение таблеток не приводят к ошибкам. -
CREATE TABLE AS
позволяет использовать в одном запросе и колоночные таблицы, и строковые таблицы. -
CREATE TABLE AS
создаёт таблицу во временной директории.tmp/sessions
, а после успешной записи данных перемещает её в указанное место. Если операция прервётся из-за ошибки, временная таблица не удаляется мгновенно, а остаётся в системе ещё на некоторое время.
Примеры
CREATE TABLE my_table (
PRIMARY KEY (key)
) AS SELECT
1 AS key,
"test" AS value;
CREATE TABLE my_table (
PRIMARY KEY (key1, key2)
) WITH (
STORE=COLUMN
) AS SELECT
key AS key1,
Unwrap(other_key) AS key2,
value,
String::Contains(value, "test") AS has_test
FROM other_table;