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

# Обновление и удаление данных ClickHouse

> Описывает, как выполнять операции обновления и удаления в ClickHouse

<a href="/get-started/quickstarts/home" onClick={(e) => { e.preventDefault(); window.location.href = (window.location.pathname.startsWith('/docs') ? '/docs' : '') + '/get-started/quickstarts/home'; }} className="inline-flex items-center gap-1.5 text-sm text-gray-500 dark:text-zinc-500 hover:text-gray-900 dark:hover:text-[#fdff75] transition-colors font-normal no-underline"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className="shrink-0"><path d="M19 12H5" /><path d="M12 19l-7-7 7-7" /></svg>All quickstarts</a>

<div className="mt-2 flex flex-wrap gap-2">
  <Badge size="lg" color="blue">Хранилище данных</Badge>
  <Badge size="lg" color="orange">OSS</Badge>
</div>

Хотя ClickHouse ориентирован на аналитические рабочие нагрузки с большими объемами данных, в некоторых случаях существующие данные можно изменять или
удалять. Эти операции называются "мутациями" и выполняются с помощью команды `ALTER TABLE`.

<Tip>
  Если вам нужно часто выполнять обновления, рассмотрите возможность использования [дедупликации](/ru/concepts/features/operations/insert/deduplication) в ClickHouse, которая позволяет обновлять
  и/или удалять строки без создания мутации. В качестве альтернативы используйте [легковесные обновления](/ru/reference/statements/update)
  или [легковесные удаления](/ru/concepts/features/operations/delete/lightweight-delete)
</Tip>

<div id="updating-data">
  ## Обновление данных
</div>

Используйте команду `ALTER TABLE...UPDATE`, чтобы обновить строки в таблице:

```sql theme={null}
ALTER TABLE [<database>.]<table> UPDATE <column> = <expression> WHERE <filter_expr>
```

`<expression>` — это новое значение столбца для строк, удовлетворяющих условию `<filter_expr>`. `<expression>` должен иметь тот же тип данных, что и столбец, или приводиться к нему с помощью оператора `CAST`. `<filter_expr>` должен возвращать значение `UInt8` (ноль или ненулевое) для каждой строки данных. Несколько операторов `UPDATE <column>` можно объединить в одной команде `ALTER TABLE`, разделив их запятыми.

**Примеры**:

1. Такая мутация позволяет обновить `visitor_id`, заменив его новым значением с помощью поиска по словарю:

   ```sql theme={null}
   ALTER TABLE website.clicks
   UPDATE visitor_id = getDict('visitors', 'new_visitor_id', visitor_id)
   WHERE visit_date < '2022-01-01'
   ```

2. Изменение нескольких значений в одной команде может быть эффективнее, чем выполнение нескольких команд:

   ```sql theme={null}
   ALTER TABLE website.clicks
   UPDATE url = substring(url, position(url, '://') + 3), visitor_id = new_visit_id
   WHERE visit_date < '2022-01-01'
   ```

3. Мутации можно выполнять с предложением `ON CLUSTER` для сегментированных таблиц:

   ```sql theme={null}
   ALTER TABLE clicks ON CLUSTER main_cluster
   UPDATE click_count = click_count / 2
   WHERE visitor_id ILIKE '%robot%'
   ```

<Note>
  Невозможно обновлять столбцы, которые входят в основной ключ или ключ сортировки.
</Note>

<div id="deleting-data">
  ## Удаление данных
</div>

Для удаления строк используйте команду `ALTER TABLE`:

```sql theme={null}
ALTER TABLE [<database>.]<table> DELETE WHERE <filter_expr>
```

Выражение `<filter_expr>` должно возвращать значение UInt8 для каждой строки данных.

**Примеры**

1. Удалить все записи, в которых значение столбца содержится в массиве значений:
   ```sql theme={null}
   ALTER TABLE website.clicks DELETE WHERE visitor_id in (253, 1002, 4277)
   ```

2. Что изменяет этот запрос?
   ```sql theme={null}
   ALTER TABLE clicks ON CLUSTER main_cluster DELETE WHERE visit_date < '2022-01-02 15:00:00' AND page_id = '573'
   ```

<Note>
  Чтобы удалить все данные из таблицы, эффективнее использовать команду `TRUNCATE TABLE [<database].]<table>`. Эту команду также можно выполнить с предложением `ON CLUSTER`.
</Note>

Подробнее см. на [странице документации об операторе `DELETE`](/ru/reference/statements/delete).

<div id="lightweight-deletes">
  ## Легковесные удаления
</div>

Ещё один способ удалять строки — использовать команду `DELETE FROM`, которая называется **легковесным удалением**. Удалённые строки сразу помечаются как удалённые и автоматически исключаются из всех последующих запросов, поэтому не нужно ждать слияния частей или использовать ключевое слово `FINAL`. Очистка данных происходит асинхронно в фоновом режиме.

```sql theme={null}
DELETE FROM [db.]table [ON CLUSTER cluster] [WHERE expr]
```

Например, следующий запрос удаляет все строки из таблицы `hits`, в которых столбец `Title` содержит текст `hello`:

```sql theme={null}
DELETE FROM hits WHERE Title LIKE '%hello%';
```

Несколько замечаний о легковесных удалениях:

* Эта возможность доступна только для семейства движков таблиц `MergeTree`.
* По умолчанию легковесные удаления выполняются синхронно: операция ждёт, пока все реплики обработают удаление. Это поведение управляется [настройкой `lightweight_deletes_sync`](/ru/reference/settings/session-settings#lightweight_deletes_sync).

<div className="mt-8">
  <a href="/get-started/quickstarts/home" onClick={(e) => { e.preventDefault(); window.location.href = (window.location.pathname.startsWith('/docs') ? '/docs' : '') + '/get-started/quickstarts/home'; }} className="inline-flex items-center gap-1.5 text-sm text-gray-500 dark:text-zinc-500 hover:text-gray-900 dark:hover:text-[#fdff75] transition-colors font-normal no-underline"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className="shrink-0"><path d="M19 12H5" /><path d="M12 19l-7-7 7-7" /></svg>All quickstarts</a>
</div>
