# Ключ и поля словаря Секция `` описывает ключ словаря и поля, доступные для запросов. Описание в формате XML: ```xml Id ... ``` Атрибуты описываются элементами: - `` — [столбец с ключом](external_dicts_dict_structure.md#ext_dict_structure-key). - `` — [столбец данных](external_dicts_dict_structure.md#ext_dict_structure-attributes). Можно задать несколько столбцов. Запрос создания словаря: ```sql CREATE DICTIONARY dict_name ( Id UInt64, -- attributes ) PRIMARY KEY Id ... ``` Атрибуты задаются в теле запроса: - `PRIMARY KEY` — [столбец с ключом](external_dicts_dict_structure.md#ext_dict_structure-key) - `AttrName AttrType` — [столбец данных](external_dicts_dict_structure.md#ext_dict_structure-attributes). Можно задать несколько столбцов. ## Ключ {#ext_dict_structure-key} ClickHouse поддерживает следующие виды ключей: - Числовой ключ. `UInt64`. Описывается в теге ``. - Составной ключ. Набор значений разного типа. Описывается в теге ``. Структура может содержать либо `` либо ``. !!! warning "Обратите внимание" Ключ не надо дополнительно описывать в атрибутах. ### Числовой ключ {#ext_dict-numeric-key} Тип: `UInt64`. Пример конфигурации: ```xml Id ``` Поля конфигурации: - `name` — имя столбца с ключами. ### Составной ключ Ключом может быть кортеж (`tuple`) из полей произвольных типов. В этом случае [layout](external_dicts_dict_layout.md) должен быть `complex_key_hashed` или `complex_key_cache`. !!! tip "Совет" Составной ключ может состоять из одного элемента. Это даёт возможность использовать в качестве ключа, например, строку. Структура ключа задаётся в элементе ``. Поля ключа задаются в том же формате, что и [атрибуты](external_dicts_dict_structure.md) словаря. Пример: ```xml field1 String field2 UInt32 ... ... ``` При запросе в функции `dictGet*` в качестве ключа передаётся кортеж. Пример: `dictGetString('dict_name', 'attr_name', tuple('string for field1', num_for_field2))`. ## Атрибуты {#ext_dict_structure-attributes} Пример конфигурации: ```xml ... Name ClickHouseDataType rand64() true true true ``` Поля конфигурации: | Тег | Описание | Обязательный | | ---- | ------------- | --------- | | `name` | Имя столбца. | Да | | `type` | Тип данных ClickHouse.
ClickHouse пытается привести значение из словаря к заданному типу данных. Например, в случае MySQL, в таблице-источнике поле может быть `TEXT`, `VARCHAR`, `BLOB`, но загружено может быть как `String`. [Nullable](../../data_types/nullable.md) не поддерживается. | Да | | `null_value` | Значение по умолчанию для несуществующего элемента.
В примере это пустая строка. Нельзя указать значение `NULL`. | Да | | `expression` | [Выражение](../syntax.md#syntax-expressions), которое ClickHouse выполняет со значением.
Выражением может быть имя столбца в удаленной SQL базе. Таким образом, вы можете использовать его для создания псевдонима удаленного столбца.

Значение по умолчанию: нет выражения. | Нет | `hierarchical` | Если `true`, то атрибут содержит ключ предка для текущего элемента. Смотрите [Иерархические словари](external_dicts_dict_hierarchical.md).

Default value: `false`. | No| `injective` | Признак [инъективности](https://ru.wikipedia.org/wiki/Инъекция_(математика)) отображения `id -> attribute`.
Если `true`, то обращения к словарям с включенной инъективностью могут быть автоматически переставлены ClickHouse за стадию `GROUP BY`, что как правило существенно сокращает их количество.

Значение по умолчанию: `false`. | Нет | | `is_object_id` | Признак того, что запрос выполняется к документу MongoDB по `ObjectID`.

Значение по умолчанию: `false`. | Нет | ## Смотрите также - [Функции для работы с внешними словарями](../functions/ext_dict_functions.md). [Оригинальная статья](https://clickhouse.tech/docs/ru/query_language/dicts/external_dicts_dict_structure/)