Создание и заполнение таблицы на основе результатов запроса

Внимание

Поддерживается только для колоночных таблиц. Поддержка функциональности для строковых таблиц находится в разработке.

Вызов 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;
Предыдущая
Следующая