Spec-Zone.ru › DuckDB

Заявление CREATE TABLE

Заявление CREATE TABLE создаёт таблицу в каталоге.

Примеры

Создайте таблицу с двумя целочисленными столбцами (i и j):

CREATE TABLE t1 (i INTEGER, j INTEGER);

Создайте таблицу с первичным ключом:

CREATE TABLE t1 (id INTEGER PRIMARY KEY, j VARCHAR);

Создайте таблицу с составным первичным ключом:

CREATE TABLE t1 (id INTEGER, j VARCHAR, PRIMARY KEY (id, j));

Создайте таблицу с различными типами и ограничениями:

CREATE TABLE t1 (
    i INTEGER NOT NULL,
    decimalnr DOUBLE CHECK (decimalnr < 10),
    date DATE UNIQUE,
    time TIMESTAMP
);

Создайте таблицу с использованием CREATE TABLE ... AS SELECT (CTAS):

CREATE TABLE t1 AS
    SELECT 42 AS i, 84 AS j;

Создайте таблицу из CSV-файла (автоматически определяя имена и типы столбцов):

CREATE TABLE t1 AS
    SELECT *
    FROM read_csv('path/file.csv');

Мы можем использовать синтаксис FROM-first для пропуска SELECT *:

CREATE TABLE t1 AS
    FROM read_csv('path/file.csv');

Скопируйте схему t2 в t1:

CREATE TABLE t1 AS
    FROM t2
    LIMIT 0;

Временные таблицы

Временные таблицы могут быть созданы с помощью заявления CREATE TEMP TABLE или CREATE TEMPORARY TABLE (см. диаграмму ниже). Временные таблицы имеют область действия сеанса (аналогично PostgreSQL, например), что означает, что только конкретное подключение, которое их создало, может получить к ним доступ, а после закрытия подключения к DuckDB они будут автоматически удалены. Временные таблицы хранятся в памяти, а не на диске (даже при подключении к постоянному DuckDB), но если параметр temp_directory конфигурации установлен при подключении или с помощью команды SET, данные будут записаны на диск, если память будет переполнена.

Создайте временную таблицу из CSV-файла (автоматически определяя имена и типы столбцов):

CREATE TEMP TABLE t1 AS
    SELECT *
    FROM read_csv('path/file.csv');

Разрешить временным таблицам переносить избыточную память на диск:

SET temp_directory = '/path/to/directory/';

Временные таблицы являются частью схемы temp.main. Хотя это не рекомендуется, их имена могут совпадать с именами обычных таблиц базы данных. В таких случаях используйте их полное имя, например, temp.main.t1, для устранения неоднозначности.

CREATE OR REPLACE

Синтаксис CREATE OR REPLACE позволяет создать новую таблицу или перезаписать существующую таблицу новой. Это сокращение для удаления существующей таблицы и последующего создания новой.

Создайте таблицу с двумя целочисленными столбцами (i и j), даже если t1 уже существует:

CREATE OR REPLACE TABLE t1 (i INTEGER, j INTEGER);

IF NOT EXISTS

Синтаксис IF NOT EXISTS будет продолжен только при создании таблицы, если она ещё не существует. Если таблица уже существует, никаких действий не будет предпринято, и существующая таблица останется в базе данных.

Создайте таблицу с двумя целочисленными столбцами (i и j): только если t1 ещё не существует:

CREATE TABLE IF NOT EXISTS t1 (i INTEGER, j INTEGER);

CREATE TABLE ... AS SELECT (CTAS)

DuckDB поддерживает синтаксис CREATE TABLE ... AS SELECT, также известный как «CTAS»:

CREATE TABLE nums AS
    SELECT i
    FROM range(0, 3) t(i);

Этот синтаксис можно использовать в сочетании с читателем CSV, сокращённым синтаксисом для непосредственного считывания из CSV-файлов без указания функции, FROM-first синтаксисом и поддержкой HTTP(S), что приводит к компактным SQL-командам, таким как:

CREATE TABLE flights AS
    FROM 'https://duckdb.org/data/flights.csv';

Конструктор CTAS также работает с модификатором OR REPLACE, что приводит к CREATE OR REPLACE TABLE ... AS заявлениям:

CREATE OR REPLACE TABLE flights AS
    FROM 'https://duckdb.org/data/flights.csv';

Обратите внимание, что невозможно создать таблицы с помощью заявлений CTAS с ограничениями (первичные ключи, ограничения проверки и т. д.).

Ограничения проверки

Ограничение CHECK — это выражение, которое должно выполняться значениями каждой строки в таблице.

CREATE TABLE t1 (
    id INTEGER PRIMARY KEY,
    percentage INTEGER CHECK (0 <= percentage AND percentage <= 100)
);
INSERT INTO t1 VALUES (1, 5);
INSERT INTO t1 VALUES (2, -1);
Error: Constraint Error: CHECK constraint failed: t1
INSERT INTO t1 VALUES (3, 101);
Error: Constraint Error: CHECK constraint failed: t1
CREATE TABLE t2 (id INTEGER PRIMARY KEY, x INTEGER, y INTEGER CHECK (x < y));
INSERT INTO t2 VALUES (1, 5, 10);
INSERT INTO t2 VALUES (2, 5, 3);
Error: Constraint Error: CHECK constraint failed: t2

CHECK ограничения также могут быть добавлены в рамках CONSTRAINTS-клауза:

CREATE TABLE t3 (
    id INTEGER PRIMARY KEY,
    x INTEGER,
    y INTEGER,
    CONSTRAINT x_smaller_than_y CHECK (x < y)
);
INSERT INTO t3 VALUES (1, 5, 10);
INSERT INTO t3 VALUES (2, 5, 3);
Error: Constraint Error: CHECK constraint failed: t3

Ограничения внешних ключей

FOREIGN KEY — это столбец (или набор столбцов), который ссылается на первичный ключ другой таблицы. Внешние ключи проверяют целостность ссылок, то есть при вставке должен существовать соответствующий первичный ключ в другой таблице.

CREATE TABLE t1 (id INTEGER PRIMARY KEY, j VARCHAR);
CREATE TABLE t2 (
    id INTEGER PRIMARY KEY,
    t1_id INTEGER,
    FOREIGN KEY (t1_id) REFERENCES t1 (id)
);

Пример:

INSERT INTO t1 VALUES (1, 'a');
INSERT INTO t2 VALUES (1, 1);
INSERT INTO t2 VALUES (2, 2);
Error: Constraint Error: Violates foreign key constraint because key "id: 2" does not exist in the referenced table

Внешние ключи могут быть определены на составных первичных ключах:

CREATE TABLE t3 (id INTEGER, j VARCHAR, PRIMARY KEY (id, j));
CREATE TABLE t4 (
    id INTEGER PRIMARY KEY, t3_id INTEGER, t3_j VARCHAR,
    FOREIGN KEY (t3_id, t3_j) REFERENCES t3(id, j)
);

Пример:

INSERT INTO t3 VALUES (1, 'a');
INSERT INTO t4 VALUES (1, 1, 'a');
INSERT INTO t4 VALUES (2, 1, 'b');
Error: Constraint Error: Violates foreign key constraint because key "id: 1, j: b" does not exist in the referenced table

Внешние ключи также могут быть определены на уникальных столбцах:

CREATE TABLE t5 (id INTEGER UNIQUE, j VARCHAR);
CREATE TABLE t6 (
    id INTEGER PRIMARY KEY,
    t5_id INTEGER,
    FOREIGN KEY (t5_id) REFERENCES t5(id)
);

Ограничения

Внешние ключи имеют следующие ограничения.

Внешние ключи с каскадными удалениями (FOREIGN KEY ... REFERENCES ... ON DELETE CASCADE) не поддерживаются.

Вставка в таблицы с самоссылочными внешними ключами в настоящее время не поддерживается и приведет к следующей ошибке:

Constraint Error: Violates foreign key constraint because key "..." does not exist in the referenced table.

Сгенерированные столбцы

Синтаксис [type] [GENERATED ALWAYS] AS (expr) [VIRTUAL|STORED] создаст сгенерированный столбец. Данные в таком столбце генерируются из своего выражения, которое может ссылаться на другие (обычные или сгенерированные) столбцы таблицы. Поскольку они производятся вычислениями, в эти столбцы нельзя вставлять данные напрямую.

DuckDB может определить тип сгенерированного столбца на основе типа возвращаемого значения выражения. Это позволяет вам опустить тип при объявлении сгенерированного столбца. Можно явно установить тип, но вставки в ссылающиеся столбцы могут завершиться ошибкой, если тип не может быть преобразован в тип сгенерированного столбца.

Сгенерированные столбцы бывают двух типов: VIRTUAL и STORED. Данные виртуальных сгенерированных столбцов не сохраняются на диске, а вычисляются каждый раз, когда столбец используется (через оператор select).

Данные сохранённых сгенерированных столбцов сохраняются на диске и вычисляются каждый раз, когда меняются данные их зависимостей (через оператор INSERT / UPDATE / DROP).

В настоящее время поддерживается только тип VIRTUAL, и это также значение по умолчанию, если последнее поле пусто.

Простейший синтаксис для сгенерированного столбца:

Тип выводится из выражения, а вариант по умолчанию VIRTUAL:

CREATE TABLE t1 (x FLOAT, two_x AS (2 * x));

Полное указание того же сгенерированного столбца для полноты:

CREATE TABLE t1 (x FLOAT, two_x FLOAT GENERATED ALWAYS AS (2 * x) VIRTUAL);

Синтаксис

© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/sql/statements/create_table.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API