Заполнение таблицы данными из запроса
Вызов 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;