сделать alter и убрать значение из множества значений Enum'a.
Подскажите, пожалуйста, это корректное поведение?
пример
CREATE TABLE t ON CLUSTER replicated
(
`a` UInt64,
`b` Enum8('a' = 1, 'b' = 2)
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/default/{shard}/t', '{replica}')
ORDER BY (b, a)
insert into t values (1,1),(2,2)
Далее запрос на кластере ALTER TABLE t ON CLUSTER replicated MODIFY COLUMN `b Enum8('a' = 1)` падает с ошибкой Cannot execute replicated DDL query, maximum retires exceeded
если делать на одном хосте, то ошибка следующая:
Received exception from server (version 20.8.12):
Code: 524. DB::Exception: Received from localhost:9100. DB::Exception: ALTER of key column b from type Enum8('a' = 1, 'b' = 2) to type Enum8('a' = 1) must be metadata-only.
Версия КХ 20.8.12.2
А зачем вообще убирать из enum значение?
К сути дела не относится, но так работают миграции, чтобы базу можно было привести к предыдущему состоянию
А добавление значений работает?
добавление работает
мне кажется что это логично - что делать если уже записал данные с новым значением?
Енам хранится просто как UInt8, конкретно в данных ничего не меняется при изменении его
кликхаус же должен мапить ваше значение в какой то стринг
если при выборке значение не присутствует для маппинга, то КХ кидает ошибку
это только при инсерте. а что делать, если данные уже на диске?
Лучше получить ошибку во время неразрешенной операции, чем уже постфактум.
Возможно, но речь не об этом) Указано, что из енама можно убирать значения
Скорее всего это не относится к enum которые учувствуют в ORDER BY и PARTITION KEY. Раньше туда в них даже добавлять значения было нельзя. Впрочем вы можете сделать feature request на гитхабе
На гитхабе видел несколько багов, по поводу того, что нельзя альтерить Enum'ы, которые участвуют в Partition by. Их исправляли
чаще всего в таком случае: просто забыли разрешить такую операцию, потому что никто не просил, и внутри яндекса это не нужно
Обсуждают сегодня