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

> Documentação do tipo de dado UUID no ClickHouse

# UUID

Um Identificador Universalmente Único (UUID) é um valor de 16 bytes usado para identificar registros. Para informações detalhadas sobre UUIDs, consulte a [Wikipedia](https://en.wikipedia.org/wiki/Universally_unique_identifier).

Embora existam diferentes variantes de UUID, por exemplo, UUIDv4 e UUIDv7 (veja [aqui](https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis)), o ClickHouse não valida se os UUIDs inseridos estão em conformidade com alguma variante específica.
Internamente, os UUIDs são tratados como uma sequência de 16 bytes aleatórios, com representação [8-4-4-4-12](https://en.wikipedia.org/wiki/Universally_unique_identifier#Textual_representation) no nível SQL.

Exemplo de valor UUID:

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

O UUID padrão é composto só por zeros. Ele é usado, por exemplo, quando um novo registro é inserido, mas nenhum valor é especificado para uma coluna UUID:

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

<Warning>
  Por motivos históricos, os UUIDs são ordenados pela segunda metade.

  Embora isso seja aceitável para valores UUIDv4, pode prejudicar o desempenho de colunas UUIDv7 usadas em definições de índice primário (o uso em chaves de ordenação ou de partição não é um problema).
  Mais especificamente, os valores UUIDv7 consistem em um timestamp na primeira metade e um contador na segunda metade.
  Assim, a ordenação de UUIDv7 em índices primários esparsos (isto é, os primeiros valores de cada grânulo de índice) será pelo campo do contador.
  Supondo que os UUIDs fossem ordenados pela primeira metade (timestamp), espera-se que a etapa de análise do índice primário no início das consultas descarte todas as marcas em todas as partes, exceto uma.
  No entanto, com a ordenação pela segunda metade (contador), espera-se que pelo menos uma marca seja retornada para todas as partes, levando a acessos desnecessários ao disco.
</Warning>

Exemplo:

```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 │
└──────────────────────────────────────┘

```

Como solução alternativa, o UUID pode ser convertido em um timestamp extraído da segunda metade:

```sql title="Query" theme={null}
CREATE TABLE tab (uuid UUID) ENGINE = MergeTree PRIMARY KEY (UUIDv7ToDateTime(uuid));
-- Or alternatively:                      [...] 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;
```

Resultado (supondo que os mesmos dados sejam inseridos):

```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">
  ## Gerando UUIDs
</div>

O ClickHouse fornece a função [generateUUIDv4](/pt-BR/reference/functions/regular-functions/uuid-functions) para gerar UUIDs aleatórios da versão 4.

<div id="usage-example">
  ## Exemplo de uso
</div>

**Exemplo 1**

Este exemplo demonstra a criação de uma tabela com uma coluna UUID e a inserção de um valor na tabela.

```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 │
└──────────────────────────────────────┴───────────┘
```

**Exemplo 2**

Neste exemplo, nenhum valor é especificado para a coluna UUID quando o registro é inserido, ou seja, o valor UUID padrão é inserido:

```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">
  ## Restrições
</div>

O tipo de dado UUID suporta apenas as funções que também são compatíveis com o tipo de dado [String](/pt-BR/reference/data-types/string) (por exemplo, [min](/pt-BR/reference/functions/aggregate-functions/min), [max](/pt-BR/reference/functions/aggregate-functions/max) e [count](/pt-BR/reference/functions/aggregate-functions/count)).

O tipo de dado UUID não oferece suporte a operações aritméticas (por exemplo, [abs](/pt-BR/reference/functions/regular-functions/arithmetic-functions#abs)) nem a funções de agregação, como [sum](/pt-BR/reference/functions/aggregate-functions/sum) e [avg](/pt-BR/reference/functions/aggregate-functions/avg).
