2020-03-20 18:20:59 +00:00
# Ключ и поля словаря {#kliuch-i-polia-slovaria}
2017-10-25 05:27:09 +00:00
Секция `<structure>` описывает ключ словаря и поля, доступные для запросов.
2020-02-08 11:21:22 +00:00
Описание в формате XML:
2017-10-25 05:27:09 +00:00
2020-03-20 18:20:59 +00:00
``` xml
2017-10-25 05:27:09 +00:00
< dictionary >
< structure >
< id >
< name > Id< / name >
< / id >
< attribute >
<!-- Attribute parameters -->
< / attribute >
...
< / structure >
< / dictionary >
```
2020-02-08 11:21:22 +00:00
Атрибуты описываются элементами:
2020-04-30 18:19:18 +00:00
- `<id>` — [столбец с ключом ](external-dicts-dict-structure.md#ext_dict_structure-key ).
- `<attribute>` — [столбец данных ](external-dicts-dict-structure.md#ext_dict_structure-attributes ). Можно задать несколько атрибутов.
2020-02-08 11:21:22 +00:00
2020-02-20 06:31:06 +00:00
Создание словаря запросом:
2020-02-08 11:21:22 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2020-02-08 11:21:22 +00:00
CREATE DICTIONARY dict_name (
Id UInt64,
-- attributes
)
PRIMARY KEY Id
...
```
Атрибуты задаются в теле запроса:
2020-04-30 18:19:18 +00:00
- `PRIMARY KEY` — [столбец с ключом ](external-dicts-dict-structure.md#ext_dict_structure-key )
- `AttrName AttrType` — [столбец данных ](external-dicts-dict-structure.md#ext_dict_structure-attributes ). Можно задать несколько столбцов.
2017-10-25 05:27:09 +00:00
2020-03-22 09:14:59 +00:00
## Ключ {#ext_dict_structure-key}
2017-10-25 05:27:09 +00:00
ClickHouse поддерживает следующие виды ключей:
2020-03-21 04:11:51 +00:00
- Числовой ключ. `UInt64` . Описывается в теге `<id>` или ключевым словом `PRIMARY KEY` .
- Составной ключ. Н а б о р значений разного типа. Описывается в теге `<key>` или ключевым словом `PRIMARY KEY` .
2017-10-25 05:27:09 +00:00
2020-02-20 06:31:06 +00:00
Структура может содержать либо `<id>` либо `<key>` . DDL-запрос может содержать только `PRIMARY KEY` .
2017-10-25 05:27:09 +00:00
2019-07-26 05:49:26 +00:00
!!! warning "Обратите внимание"
2018-07-20 17:35:34 +00:00
Ключ не надо дополнительно описывать в атрибутах.
2017-10-25 05:27:09 +00:00
2020-03-22 09:14:59 +00:00
### Числовой ключ {#ext_dict-numeric-key}
2017-10-25 05:27:09 +00:00
2019-07-26 05:49:26 +00:00
Тип: `UInt64` .
2017-10-25 05:27:09 +00:00
Пример конфигурации:
2020-03-20 18:20:59 +00:00
``` xml
2017-10-25 05:27:09 +00:00
< id >
< name > Id< / name >
< / id >
```
Поля конфигурации:
2020-03-21 04:11:51 +00:00
- `name` — имя столбца с ключами.
2017-10-25 05:27:09 +00:00
2020-02-20 06:31:06 +00:00
Для DDL-запроса:
2020-03-20 18:20:59 +00:00
``` sql
2020-02-20 06:31:06 +00:00
CREATE DICTIONARY (
Id UInt64,
...
)
PRIMARY KEY Id
...
```
2020-03-21 04:11:51 +00:00
- `PRIMARY KEY` – имя столбца с ключами.
2020-02-20 06:31:06 +00:00
2020-03-20 18:20:59 +00:00
### Составной ключ {#sostavnoi-kliuch}
2017-10-25 05:27:09 +00:00
2020-04-30 18:19:18 +00:00
Ключом может быть кортеж (`tuple`) из полей произвольных типов. В этом случае [layout ](external-dicts-dict-layout.md ) должен быть `complex_key_hashed` или `complex_key_cache` .
2017-10-25 05:27:09 +00:00
2018-07-20 17:35:34 +00:00
!!! tip "Совет"
2019-08-23 10:55:34 +00:00
Составной ключ может состоять из одного элемента. Это даёт возможность использовать в качестве ключа, например, строку.
2017-10-25 05:27:09 +00:00
2020-04-30 18:19:18 +00:00
Структура ключа задаётся в элементе `<key>` . Поля ключа задаются в том же формате, что и [атрибуты ](external-dicts-dict-structure.md ) словаря. Пример:
2017-10-25 05:27:09 +00:00
2020-03-20 18:20:59 +00:00
``` xml
2017-10-25 05:27:09 +00:00
< structure >
< key >
< attribute >
< name > field1< / name >
< type > String< / type >
< / attribute >
< attribute >
< name > field2< / name >
< type > UInt32< / type >
< / attribute >
...
< / key >
...
```
2020-02-20 06:31:06 +00:00
или
2020-03-20 18:20:59 +00:00
``` sql
2020-02-20 06:31:06 +00:00
CREATE DICTIONARY (
field1 String,
field2 String
...
)
PRIMARY KEY field1, field2
...
```
2017-10-25 05:27:09 +00:00
При запросе в функции `dictGet*` в качестве ключа передаётся кортеж. Пример: `dictGetString('dict_name', 'attr_name', tuple('string for field1', num_for_field2))` .
2020-03-22 09:14:59 +00:00
## Атрибуты {#ext_dict_structure-attributes}
2017-10-25 05:27:09 +00:00
Пример конфигурации:
2020-03-20 18:20:59 +00:00
``` xml
2017-10-25 05:27:09 +00:00
< structure >
...
< attribute >
< name > Name< / name >
2019-07-26 05:49:26 +00:00
< type > ClickHouseDataType< / type >
2017-10-25 05:27:09 +00:00
< null_value > < / null_value >
< expression > rand64()< / expression >
< hierarchical > true< / hierarchical >
< injective > true< / injective >
2018-02-21 10:03:55 +00:00
< is_object_id > true< / is_object_id >
2017-10-25 05:27:09 +00:00
< / attribute >
< / structure >
```
2020-02-20 06:31:06 +00:00
или
2020-03-20 18:20:59 +00:00
``` sql
2020-02-20 06:31:06 +00:00
CREATE DICTIONARY somename (
Name ClickHouseDataType DEFAULT '' EXPRESSION rand64() HIERARCHICAL INJECTIVE IS_OBJECT_ID
)
```
2017-10-25 05:27:09 +00:00
Поля конфигурации:
2020-04-30 18:19:18 +00:00
| Т е г | Описание | Обязательный |
|------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|
| `name` | Имя столбца. | Да |
2020-06-05 19:22:38 +00:00
| `type` | Тип данных ClickHouse.< br /> ClickHouse пытается привести значение из словаря к заданному типу данных. Например, в случае MySQL, в таблице-источнике поле может быть `TEXT` , `VARCHAR` , `BLOB` , но загружено может быть как `String` . [Nullable ](../../../sql-reference/data-types/nullable.md ) не поддерживается. | Да |
2020-04-30 18:19:18 +00:00
| `null_value` | Значение по умолчанию для несуществующего элемента.< br /> В примере это пустая строка. Нельзя указать значение `NULL` . | Да |
| `expression` | [Выражение ](../../syntax.md#syntax-expressions ), которое ClickHouse выполняет с о значением.< br /> Выражением может быть имя столбца в удаленной SQL базе. Таким образом, вы можете использовать е г о для создания псевдонима удаленного столбца.< br />< br /> Значение по умолчанию: нет выражения. | Нет |
| < a name = "hierarchical-dict-attr" ></ a > `hierarchical` | Если `true` , то атрибут содержит ключ предка для текущего элемента. Смотрите [Иерархические словари ](external-dicts-dict-hierarchical.md ).< br />< br /> Default value: `false` . | No |
| `is_object_id` | Признак того, что запрос выполняется к документу MongoDB по `ObjectID` .< br />< br /> Значение по умолчанию: `false` . | Нет |
2020-02-08 11:21:22 +00:00
2020-03-20 18:20:59 +00:00
## Смотрите также {#smotrite-takzhe}
2020-02-08 11:21:22 +00:00
2020-06-05 19:22:38 +00:00
- [Функции для работы с внешними словарями ](../../../sql-reference/functions/ext-dict-functions.md ).
2020-02-08 11:21:22 +00:00
2020-01-30 10:34:55 +00:00
[Оригинальная статья ](https://clickhouse.tech/docs/ru/query_language/dicts/external_dicts_dict_structure/ ) <!--hide-->