Заполнение таблицы данными из запроса

Вызов CREATE TABLE AS создает новую таблицу, которая заполнена данными из результатов запроса.

CREATE TABLE table_name (
    PRIMARY KEY ( column, ... )
)
WITH ( key = value, ... )
AS SELECT ...

Имена и типы колонок будут соответствовать результатам SELECT.
Для колонок неопционального типа также будет выставлен модификатор NOT NULL.

При создании таблицы через CREATE TABLE AS не поддерживается указание имен колонок (имена колонок созданной таблицы берутся из результата запроса), вторичных индексов, векторных индексов, групп колонок. Все вышеперечисленное можно изменять при помощи 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 при выполнении создаёт временную таблицу и перемещает её по нужному пути после окончания записи данных. Если при выполнении CREATE TABLE AS произошла ошибка приведшая к прерыванию выполнения команды, то временная таблица может быть удалена не сразу, а в течение небольшого промежутка времени.

Примеры

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