> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8a08bda2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Документация по типу данных UUID в ClickHouse

# UUID

Универсальный уникальный идентификатор (UUID) — это 16-байтовое значение, используемое для идентификации записей. Подробную информацию о UUID см. в [Википедии](https://en.wikipedia.org/wiki/Universally_unique_identifier).

Хотя существуют разные варианты UUID, например UUIDv4 и UUIDv7 (см. [здесь](https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis)), ClickHouse не проверяет, соответствуют ли вставленные UUID какому-либо конкретному варианту.
Внутренне UUID рассматриваются как последовательность из 16 случайных байтов с представлением [8-4-4-4-12](https://en.wikipedia.org/wiki/Universally_unique_identifier#Textual_representation) на уровне SQL.

Пример значения UUID:

```text theme={null}
61f0c404-5cb3-11e7-907b-a6006ad3dba0
```

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

```text theme={null}
00000000-0000-0000-0000-000000000000
```

<Warning>
  По историческим причинам UUID сортируются по второй половине.

  Хотя для значений UUIDv4 это нормально, для столбцов UUIDv7, используемых в определениях первичного индекса, это может ухудшать производительность (использование в ключах сортировки или ключах партиционирования допустимо).
  Точнее, значения UUIDv7 состоят из временной метки в первой половине и счётчика — во второй.
  Поэтому сортировка UUIDv7 в разреженных индексах первичного ключа (то есть по первым значениям каждой гранулы индекса) будет выполняться по полю счётчика.
  Если бы UUID сортировались по первой половине (временной метке), то на этапе анализа индекса первичного ключа в начале запросов, как ожидается, отсекались бы все marks во всех частях, кроме одной.
  Однако при сортировке по второй половине (счётчику), как ожидается, для всех частей будет возвращаться как минимум одна mark, что приводит к лишним обращениям к диску.
</Warning>

Пример:

```sql title="Query" theme={null}
CREATE TABLE tab (uuid UUID) ENGINE = MergeTree PRIMARY KEY (uuid);

INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
SELECT * FROM tab;
```

```text title="Response" theme={null}
┌─uuid─────────────────────────────────┐
│ 019d2555-7874-7e9d-a284-9b45a0b2f165 │
│ 019d2555-7874-7e9d-a284-9b46c3353be7 │
│ 019d2555-7878-77fc-a36f-4081aa58ec2b │
│ 019d2555-7878-77fc-a36f-40826555fb9b │
│ 019d2555-7870-7432-ba62-5250ac595328 │
│ 019d2555-7870-7432-ba62-5251da22bd19 │
│ 019d2555-786c-73e9-a031-4a7936df7d56 │
│ 019d2555-786c-73e9-a031-4a7a35a9544f │
│ 019d2555-7868-7333-89d1-2bd1639899c3 │
│ 019d2555-7868-7333-89d1-2bd297eb7d42 │
└──────────────────────────────────────┘

```

В качестве обходного решения UUID можно преобразовать во временную метку, извлечённую из его второй половины:

```sql title="Query" theme={null}
CREATE TABLE tab (uuid UUID) ENGINE = MergeTree PRIMARY KEY (UUIDv7ToDateTime(uuid));
-- Или как вариант:                       [...] PRIMARY KEY (toStartOfHour(UUIDv7ToDateTime(uuid)));

INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
SELECT * FROM tab;
```

Результат (при условии, что вставлены те же данные):

```text title="Response" theme={null}
┌─uuid─────────────────────────────────┐
│ 019d2555-7868-7333-89d1-2bd1639899c3 │
│ 019d2555-7868-7333-89d1-2bd297eb7d42 │
│ 019d2555-786c-73e9-a031-4a7936df7d56 │
│ 019d2555-786c-73e9-a031-4a7a35a9544f │
│ 019d2555-7870-7432-ba62-5250ac595328 │
│ 019d2555-7870-7432-ba62-5251da22bd19 │
│ 019d2555-7874-7e9d-a284-9b45a0b2f165 │
│ 019d2555-7874-7e9d-a284-9b46c3353be7 │
│ 019d2555-7878-77fc-a36f-4081aa58ec2b │
│ 019d2555-7878-77fc-a36f-40826555fb9b │
└──────────────────────────────────────┘

```

ORDER BY (UUIDv7ToDateTime(uuid), uuid)

<div id="generating-uuids">
  ## Генерация UUID
</div>

ClickHouse предоставляет функцию [generateUUIDv4](/ru/reference/functions/regular-functions/uuid-functions) для генерации случайных UUID версии 4.

<div id="usage-example">
  ## Пример использования
</div>

**Пример 1**

В этом примере показано, как создать таблицу со столбцом UUID и вставить в неё значение.

```sql title="Query" theme={null}
CREATE TABLE t_uuid (x UUID, y String) ENGINE=TinyLog

INSERT INTO t_uuid SELECT generateUUIDv4(), 'Example 1'

SELECT * FROM t_uuid
```

```text title="Response" theme={null}
┌────────────────────────────────────x─┬─y─────────┐
│ 417ddc5d-e556-4d27-95dd-a34d84e46a50 │ Example 1 │
└──────────────────────────────────────┴───────────┘
```

**Пример 2**

В этом примере при вставке записи значение столбца UUID не указывается, то есть используется значение UUID по умолчанию:

```sql theme={null}
INSERT INTO t_uuid (y) VALUES ('Example 2')

SELECT * FROM t_uuid
```

```text theme={null}
┌────────────────────────────────────x─┬─y─────────┐
│ 417ddc5d-e556-4d27-95dd-a34d84e46a50 │ Example 1 │
│ 00000000-0000-0000-0000-000000000000 │ Example 2 │
└──────────────────────────────────────┴───────────┘
```

<div id="restrictions">
  ## Ограничения
</div>

Тип данных UUID поддерживает только те функции, которые поддерживаются и типом данных [String](/ru/reference/data-types/string) (например, [min](/ru/reference/functions/aggregate-functions/min), [max](/ru/reference/functions/aggregate-functions/max) и [count](/ru/reference/functions/aggregate-functions/count)).

Тип данных UUID не поддерживает арифметические операции (например, [abs](/ru/reference/functions/regular-functions/arithmetic-functions#abs)) и агрегатные функции, такие как [sum](/ru/reference/functions/aggregate-functions/sum) и [avg](/ru/reference/functions/aggregate-functions/avg).
