CREATE TABLE

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

Поддерживается в версиях:  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.

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

Запрос попадает в очередь операций и обрабатывается в порядке его поступления в очередь. В ответе возвращается:

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

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

При ошибке выполнения корректного запроса все последующие запросы в логической БД блокируются. В этом случае следует устранить причины сбоя и повторить сбойную операцию. Если повторение операции невозможно, удалите сбойную операцию запросом ERASE_CHANGE_OPERATION и вручную устраните несоответствия на физическом уровне (если такие есть).

Каждое создание таблицы записывается в журнал. Журнал можно посмотреть с помощью запроса GET_CHANGES.

Синтаксис

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

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]

Параметры:

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

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

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 задает список столбцов, входящих в ключ шардирования таблицы. Все указываемые столбцы должны присутствовать в первичном ключе.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ограничения

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

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

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

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

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

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

  • Ключевое слово 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)

Таблица с размещением данных в двух датасорсах

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

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

-- создание логической таблицы 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 (
  id BIGINT NOT NULL,
  category VARCHAR(256),
  region_code INTEGER NOT NULL,
  address VARCHAR(256) NOT NULL,
  description VARCHAR(256),
  PRIMARY KEY (id, region_code)
)
DATASOURCE_TYPE ('adp_main')
PARTITION BY (region_code)

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

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)

Партиции

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

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

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

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

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

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

-- партиция для записей о транзакциях за январь 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')

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