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