CREATE TABLE

Содержание раздела
  1. Результат выполнения
  2. Как работает запрос
  3. Синтаксис
    1. Ключевое слово IF NOT EXISTS
    2. Ключевое слово PRIMARY KEY
    3. Ключевое слово DISTRIBUTED BY
    4. Ключевое слово PARTITION BY
    5. Ключевое слово DATASOURCE_TYPE
    6. Ключевое слово RETENTION
    7. Ключевое слово FOR VALUES FROM … TO
    8. Ключевое слово OPTIONS
    9. Ключевое слово LOGICAL_ONLY
  4. Варианты ответа
  5. Ограничения
    1. Ограничения выполнения
    2. Ограничения имен
    3. Ограничения ключей
    4. Ограничения ключевых слов
    5. Ограничения партиционирования
    6. Другие ограничения
  6. Примеры
    1. Логическая таблица с размещением данных во всех датасорсах
    2. Логическая таблица с составным первичным ключом
    3. Логическая таблица с размещением данных в двух датасорсах
    4. Логическая таблица, созданная только на логическом уровне
    5. Логические таблицы с retention-правилами
    6. Партиционированные таблицы и партиции с распределением данных по регионам
    7. Партиционированная таблица и партиции с распределением данных по периодам времени
    8. Прокси-таблица

Поддерживается в версиях:  6.11 / 6.10 / 6.9 / 6.8 / 6.7 / 6.6 / 6.5 / 6.4 / 6.3 / 6.2 / 6.1 / 6.0 / 5.8 / 5.7 / 5.6 / 5.5 / 5.4 / 5.3 / 5.2 / 5.1 / 5.0.

Запрос создает логическую таблицу или прокси-таблицу в логической базе данных.

Результат выполнения

При успешном выполнении запроса система создает таблицу в логической базе данных и соответствующие ей физические таблицы в указанных датасорсах.

Если в датасорсе уже есть физическая таблица с таким же именем, как у прокси-таблицы, она будет удалена перед созданием новой физической таблицы, связанной с прокси-таблицей.

Как работает запрос

Запрос попадает в очередь операций и обрабатывается в порядке его поступления в очередь. Каждое создание таблицы записывается в журнал, который можно посмотреть с помощью запроса GET_CHANGES.

Если при исполнении корректного запроса возникла ошибка, система блокирует все последующие DDL-запросы в логической базе данных. О снятии такой блокировки см. в разделе Снятие блокировки DDL-запросов.

Tslog остается без изменений при пересоздании логической таблицы с ключевым словом LOGIСAL_ONLY и удаляется — при пересоздании таблицы без LOGIСAL_ONLY. Под пересозданием таблицы понимается последовательное удаление и создание таблицы с тем же именем.

Синтаксис

Обычная логическая таблица (таблица, не участвующая в партиционировании данных):

CREATE TABLE [IF NOT EXISTS] [db_name.]table_name (
  column_name_1 datatype_1 [ NULL | NOT NULL ],
  ...
  column_name_N datatype_N [ NULL | NOT NULL ],
  PRIMARY KEY (column_list_1)
) 
[DISTRIBUTED BY (column_list_2)]
[DATASOURCE_TYPE (datasource_aliases)]
[
RETENTION (origin_datasource_alias_1, retention_period_1[, archive_datasource_alias_1])
...
RETENTION (origin_datasource_alias_M, retention_period_M[, archive_datasource_alias_M])
]
[LOGICAL_ONLY]

Партиционированная таблица:

CREATE TABLE [IF NOT EXISTS] [db_name.]table_name (
  column_name_1 datatype_1 [ NULL | NOT NULL ],
  ...
  column_name_N datatype_N [ NULL | NOT NULL ],
PRIMARY KEY (column_list_1)
)
[DISTRIBUTED BY (column_list_2)]
[DATASOURCE_TYPE (buffer_datasource_alias)]
PARTITION BY (column_list_3)
[LOGICAL_ONLY]

Партиция:

CREATE TABLE [IF NOT EXISTS] [db_name.]table_name
PARTITION OF [db_name.]partitioned_table_name
[DISTRIBUTED BY (column_list_2)]
[DATASOURCE_TYPE (datasource_aliases)]
[
RETENTION (origin_datasource_alias_1, retention_period_1[, archive_datasource_alias_1])
...
RETENTION (origin_datasource_alias_N, retention_period_N[, archive_datasource_alias_N])
]
FOR VALUES FROM (left_end_of_range_1) TO (right_end_of_range_1)
...
FOR VALUES FROM (left_end_of_range_M) TO (right_end_of_range_M)
[LOGICAL_ONLY]

Прокси-таблица (альтернативный способ создания — с помощью запроса CREATE PROXY TABLE):

CREATE TABLE [IF NOT EXISTS] [db_name.]table_name (
  column_name_1 datatype_1 [ NULL | NOT NULL ],
  ...
  column_name_N datatype_N [ NULL | NOT NULL ]
[, PRIMARY KEY (column_list_1)]
)
[DISTRIBUTED BY (column_list_2)]
[DATASOURCE_TYPE (proxy_datasource_alias)]
[OPTIONS ('
  auto.version.records.enable=false;
')]
[LOGICAL_ONLY]

Параметры:

db_name

Имя логической базы данных, в которой создается таблица. Опционально, если выбрана логическая БД, используемая по умолчанию.

table_name

Имя создаваемой логической таблицы или прокси-таблицы, уникальное среди логических сущностей логической БД.

column_name_N

Имя столбца таблицы.

datatype_N

Тип данных столбца column_name_N. Возможные значения см. в разделе Логические типы данных.

column_list_1

Список столбцов, входящих в первичный ключ таблицы. Параметр опционален для прокси-таблиц.

column_list_2

Список столбцов, входящих в ключ шардирования таблицы. Столбцы должны быть из числа столбцов первичного ключа (column_list_1). Параметр опционален для таблиц, размещаемых только в датасорсах типа ADP.

column_list_3

Список столбцов, входящих в ключ партиционирования партиционированной таблицы. Столбцы должны быть из числа столбцов первичного ключа (column_list_1). В состав ключа партиционирования не могут входить столбцы типа DOUBLE и FLOAT.

partitioned_table_name

Имя партиционированной таблицы, к которой относится создаваемая партиция.

datasource_aliases

Список имен датасорсов, в которых размещаются данные таблицы.

Элементы списка перечисляются через запятую, каждый из них указывается в одинарных кавычках (например, 'adg'). Варианты, которые остаются доступными, но могут быть удалены в будущем: значения без кавычек (например, adg) или в двойных кавычках (например, "adg").

buffer_datasource_alias

Имя датасорса, в котором размещается партиционированная таблица. Имя указывается в одинарных кавычках. На физическом уровне через этот датасорс будут загружаться данные при их загрузке и вставке в партиционированную таблицу.

proxy_datasource_alias

Имя датасорса, в котором размещается прокси-таблица. Имя указывается в одинарных кавычках.

origin_datasource_alias

Имя датасорса-источника, из которого перемещаются или удаляются неактуальные версии данных согласно retention-правилу. Имя указывается в одинарных кавычках (например, 'adb').

retention_period

Срок хранения неактуальных версий данных (в секундах) в датасорсе origin_datasource_alias согласно retention-правилу.

Если значение равно 0, в датасорсе origin_datasource_alias хранятся только актуальные версии данных, а все неактуальные версии данных перемещаются в хранилище холодных данных или удаляются при каждой проверке retention-правила.

archive_datasource_alias

Имя датасорса-приемника, куда согласно retention-правилу перемещаются неактуальные версии данных по истечении срока их хранения. Имя указывается в одинарных кавычках (например, 'adb2').

Если значение не указано, неактуальные версии данных по истечении срока хранения удаляются, а не перемещаются в хранилище холодных данных.

left_end_of_range_M

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

Можно указывать значения следующих типов из числа поддерживаемых:

  • BOOLEAN,
  • VARCHAR[(n)],
  • LINK,
  • CHAR[(n)],
  • UUID,
  • BIGINT,
  • INTEGER,
  • DATE,
  • TIME,
  • TIMESTAMP.

Диапазоны партиционирования разных партиций, относящихся к одной партиционированной таблице, должны быть указаны без пересечения значений. Диапазоны одной партиции должны быть указаны без пересечения и примыкания значений.

right_end_of_range_M

Значение, задающее правую границу диапазона партиционирования для партиции (граница включается в диапазон). Значение должно быть больше или равно left_end_of_range_M.

Возможные типы значений см. в описании параметра left_end_of_range_M выше.

Ключевое слово IF NOT EXISTS

Ключевое слово IF NOT EXISTS включает проверку наличия логической таблицы до попытки создания. Если ключевое слово указано в запросе, успешный ответ возвращается при наличии или успешном создании логической таблицы, иначе — только при успешном создании логической таблицы.

Ключевое слово PRIMARY KEY

Ключевое слово PRIMARY KEY задает список столбцов, входящих в первичный ключ таблицы.

Ключевое слово DISTRIBUTED BY

Ключевое слово DISTRIBUTED BY задает список столбцов, входящих в ключ шардирования таблицы. Все указываемые столбцы должны присутствовать в первичном ключе.

Ключевое слово обязательно для датасорсов всех типов, кроме ADP.

Ключевое слово PARTITION BY

Ключевое слово PARTITION BY используется только для партиционированных таблиц и задает список столбцов, входящих в ключ партиционирования таблицы. Все указываемые столбцы должны присутствовать в первичном ключе.

Ключевое слово DATASOURCE_TYPE

Ключевое слово DATASOURCE_TYPE задает список датасорсов для размещения данных таблицы. Если ключевое слово не указано, данные логической таблицы размещаются во всех датасорсах окружения.

Данные прокси-таблицы могут размещаться только в одном датасорсе.

См. также параметр datasource_aliases.

Ключевое слово RETENTION

Ключевое слово задает retention-правило для указанного датасорса-источника. Для каждого датасорса, где размещены данные логической таблицы, можно задать свое retention-правило.

Подробнее о retention-правилах см. в разделе Retention-правило.

Если ключевое слово не указано, неактуальные версии данных бессрочно хранятся вместе с актуальными версиями данных.

Ключевое слово FOR VALUES FROM … TO

Ключевое слово FOR VALUES FROM ... TO используется только для партиций и задает диапазон партиционирования — допустимые значения ключа партиционирования для партиции. В партицию будут загружаться, вставляться и из нее будут удаляться только те записи, в которых значение ключа партиционирования относится к любому из диапазонов этой партиции.

Ключевое слово OPTIONS

Ключевое слово OPTIONS задает список дополнительных параметров и их значений в формате option1=value1;option2=value2.... Используется только для прокси-таблиц.

Возможные значения:

  • auto.version.records.enable — признак версионирования данных таблицы, по сути означающий тип создаваемой таблицы:
    • false — таблица без версионирования данных (прокси-таблица),
    • true (по умолчанию) — таблица с версионированием данных (логическая таблица).

Ключевое слово LOGICAL_ONLY

Ключевое слово LOGICAL_ONLY позволяет создать таблицу только в логической схеме данных, без обновления физической схемы данных.

Если ключевое слово не указано, таблицу создается на логическом и физическом уровнях.

Варианты ответа

В ответе возвращается:

  • пустой объект ResultSet при успешном выполнении запроса;
  • исключение при неуспешном выполнении запроса.

Ограничения

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

Ограничения имен

  • Имена таблицы и ее столбцов должны соответствовать требованиям, описанным в разделе Соглашения об именах.
  • Имена столбцов должны быть уникальны в рамках таблицы.

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

  • Первичный ключ должен включать все столбцы ключа шардирования и все столбцы ключа партиционирования.

Ограничения ключевых слов

  • Ключевое слово RETENTION доступно только для СУБД ADB и ADP.
  • Выражение с ключевым словом RETENTION не может содержать датасорс-источник и датасорс-приемник разных типов.

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

  • Создание партиционированных таблиц и партиций доступно только в СУБД ADP.
  • Диапазоны партиционирования в партиции должны быть заданы от меньшего значения к большему, а также без пересечения и без примыкания диапазонов друг к другу.
  • Диапазоны партиционирования в партициях, относящихся к одной партиционированной таблице, должны быть заданы без пересечения значений и должны покрывать все возможные значения ключа партиционирования таблицы.
  • Партиционированная таблица и все ее партиции должны находиться в одной логической БД и иметь одинаковую структуру.
  • Для партиционированной таблицы недоступны retention-правила.
  • Вложенное партиционирование недоступно: партиция не может быть иметь свои партиции.

Другие ограничения

  • Информационная схема обновляется асинхронно, поэтому созданная таблица может не сразу появиться в информационной схеме.

Примеры

Логическая таблица с размещением данных во всех датасорсах

CREATE TABLE marketing.sales (
  id BIGINT NOT NULL,
  transaction_date TIMESTAMP NOT NULL,
  product_code VARCHAR(256) NOT NULL,
  product_units BIGINT NOT NULL,
  store_id BIGINT NOT NULL,
  description VARCHAR(256),
  PRIMARY KEY (id)
)
DISTRIBUTED BY (id)

Логическая таблица с составным первичным ключом

CREATE TABLE marketing.stores (
  id BIGINT NOT NULL,
  category VARCHAR(256) NOT NULL,
  region VARCHAR(256) NOT NULL,
  address VARCHAR(256) NOT NULL,
  description VARCHAR(256),
  PRIMARY KEY (id, region)
)
DISTRIBUTED BY (id)
DATASOURCE_TYPE ('adp', 'adb', 'adqm')

Логическая таблица с размещением данных в двух датасорсах

CREATE TABLE marketing.clients (
  id BIGINT NOT NULL,
  first_name VARCHAR(256) NOT NULL,
  last_name VARCHAR(256) NOT NULL,
  patronymic_name VARCHAR(256),
  birth_date DATE,
  PRIMARY KEY (id)
) DISTRIBUTED BY (id)
DATASOURCE_TYPE ('adp','adqm')

Логическая таблица, созданная только на логическом уровне

CREATE TABLE marketing.sales1 (
  id BIGINT NOT NULL,
  transaction_date TIMESTAMP NOT NULL,
  product_code VARCHAR(256) NOT NULL,
  product_units BIGINT NOT NULL,
  store_id BIGINT NOT NULL,
  description VARCHAR(256),
  PRIMARY KEY (id)
)
DISTRIBUTED BY (id)
LOGICAL_ONLY

Логические таблицы с retention-правилами

Таблица с периодическим остужением и удалением данных из двух датасорсов:

-- создание логической таблицы clients_all_adp с размещением в датасорсах adp1 и adp2,
-- откуда, в зависимости от датасорса, 
-- неактуальные версии данных старше месяца будут перемещаться в хранилище холодных данных (adp1 -> adp_archive) или удаляться (adp2)
CREATE TABLE marketing.clients_all_adp (
id BIGINT NOT NULL,
first_name VARCHAR(256) NOT NULL,
last_name VARCHAR(256) NOT NULL,
patronymic_name VARCHAR(256),
birth_date DATE,
PRIMARY KEY (id)
) DISTRIBUTED BY (id)
DATASOURCE_TYPE ('adp1', 'adp2')
RETENTION ('adp1', 2678400, 'adp_archive')
RETENTION ('adp2', 2678400)

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

-- создание логической таблицы clients_adp1 с размещением данных в датасорсе adp1, 
-- откуда неактуальные версии данных старше недели будут перемещаться в хранилище холодных данных
CREATE TABLE marketing.clients_adp1 (
id BIGINT NOT NULL,
first_name VARCHAR(256) NOT NULL,
last_name VARCHAR(256) NOT NULL,
patronymic_name VARCHAR(256),
birth_date DATE,
PRIMARY KEY (id)
) DISTRIBUTED BY (id)
DATASOURCE_TYPE ('adp1')
RETENTION ('adp1', 604800, 'adp_archive')

Таблица с периодическим удалением данных из одного датасорса:

-- создание логической таблицы clients_adp2 с размещением данных в датасорсе adp2, 
-- откуда неактуальные версии данных старше недели будут удаляться
CREATE TABLE marketing.clients_adp2 (
id BIGINT NOT NULL,
first_name VARCHAR(256) NOT NULL,
last_name VARCHAR(256) NOT NULL,
patronymic_name VARCHAR(256),
birth_date DATE,
PRIMARY KEY (id)
) DISTRIBUTED BY (id)
DATASOURCE_TYPE ('adp2')
RETENTION ('adp2', 604800)

Партиционированные таблицы и партиции с распределением данных по регионам

Таблицы с партиционированием данных по кодам регионов:

-- таблица с данными магазинов, партиционированными по регионам
CREATE TABLE marketing.stores_partitioned_by_regions (
  id BIGINT NOT NULL,
  category VARCHAR(256),
  region_code INTEGER NOT NULL,
  address VARCHAR(256) NOT NULL,
  rent_agreement_id BIGINT NOT NULL,
  description VARCHAR(256),
  PRIMARY KEY (id, region_code)
)
DATASOURCE_TYPE ('adp_main')
PARTITION BY (region_code);

-- таблица с данными арендных договоров магазинов, партиционированными по регионам
CREATE TABLE marketing.rent_agreements_partitioned_by_regions (
  id BIGINT NOT NULL,
  store_id BIGINT NOT NULL,
  number VARCHAR NOT NULL,
  signature_date DATE,
  effective_date DATE,
  closing_date DATE,
  region_code INTEGER NOT NULL,
  description VARCHAR,
  PRIMARY KEY(id, region_code)
)
DATASOURCE_TYPE ('adp')
PARTITION BY (region_code);

Партиции для распределения данных магазинов по регионам:

-- партиция для записей о магазинах Москвы
CREATE TABLE marketing.stores_moscow 
PARTITION OF marketing.stores_partitioned_by_regions
DATASOURCE_TYPE ('adp_moscow')
RETENTION ('adp_moscow', 2678400, 'adp_archive')
FOR VALUES FROM (77) TO (77)
FOR VALUES FROM (177) TO (177)
FOR VALUES FROM (97) TO (97)
FOR VALUES FROM (197) TO (197)
FOR VALUES FROM (99) TO (99)
FOR VALUES FROM (199) TO (199)
FOR VALUES FROM (777) TO (777);

-- партиция для записей о магазинах Санкт-Петербурга
CREATE TABLE marketing.stores_spb 
PARTITION OF marketing.stores_partitioned_by_regions
DATASOURCE_TYPE ('adp_spb')
RETENTION ('adp_spb', 2678400, 'adp_archive')
FOR VALUES FROM (78) TO (78)
FOR VALUES FROM (98) TO (98)
FOR VALUES FROM (178) TO (178);

-- партиция для записей о магазинах Новосибирска
CREATE TABLE marketing.stores_novosibirsk
PARTITION OF marketing.stores_partitioned_by_regions
DATASOURCE_TYPE ('adp_novosibirsk')
RETENTION ('adp_novosibirsk', 2678400, 'adp_archive')
FOR VALUES FROM (54) TO (54)
FOR VALUES FROM (154) TO (154);

... -- партиции для других регионов

Партиции для распределения данных договоров аренды по регионам:

-- партиция для записей об арендных договорах в Москве
CREATE TABLE marketing.rent_agreements_moscow 
PARTITION OF marketing.rent_agreements_partitioned_by_regions
DATASOURCE_TYPE ('adp_moscow')
RETENTION ('adp_moscow', 2678400, 'adp_archive')
FOR VALUES FROM (77) TO (77)
FOR VALUES FROM (177) TO (177)
FOR VALUES FROM (97) TO (97)
FOR VALUES FROM (197) TO (197)
FOR VALUES FROM (99) TO (99)
FOR VALUES FROM (199) TO (199)
FOR VALUES FROM (777) TO (777);

... -- партиции для других регионов

Партиционированная таблица и партиции с распределением данных по периодам времени

Таблица с партиционированием данных по дате и времени платежной транзакции:

CREATE TABLE marketing.sales_partitioned (
  id BIGINT NOT NULL,
  transaction_date TIMESTAMP NOT NULL,
  product_code VARCHAR(256),
  product_units BIGINT,
  store_id BIGINT,
  description VARCHAR(256),
  PRIMARY KEY (id, transaction_date)
)
DATASOURCE_TYPE ('adp_main')
PARTITION BY (transaction_date)

Партиции для распределения данных транзакций по месяцам:

-- партиция для записей о транзакциях за январь 2023 года
CREATE TABLE marketing.sales_jan_2023 
PARTITION OF marketing.sales_partitioned
DATASOURCE_TYPE ('adp1')
FOR VALUES FROM ('2023-01-01 00:00:00') TO ('2023-01-31 23:59:59');

-- партиция для записей о транзакциях за февраль 2023 года
CREATE TABLE marketing.sales_feb_2023 
PARTITION OF marketing.sales_partitioned
DATASOURCE_TYPE ('adp2')
FOR VALUES FROM ('2023-02-01 00:00:00') TO ('2023-02-28 23:59:59');

... -- партиции для записей за другие месяцы

Прокси-таблица

CREATE TABLE marketing.payments_proxy (
  id BIGINT NOT NULL,
  agreement_id BIGINT,
  type_code VARCHAR(16),
  amount DOUBLE,
  currency_code VARCHAR(3),
  description VARCHAR,
  PRIMARY KEY (id)
)
DISTRIBUTED BY (id)
DATASOURCE_TYPE ('adp')
OPTIONS ('auto.version.records.enable=false;')