2016-11-15 3 views
0

У меня есть столбец String в таблице clickhouse. Я пытаюсь изменить таблицу с ИЗМЕНЯЮТ типа в UInt32:Как изменить тип столбца с использованием функции toUInt32OrZero в clickhouse?

 
ALTER TABLE main.abonents 
MODIFY COLUMN 
device_type UInt32 DEFAULT 0 

но есть ошибка:

 
Received exception from server: 
Code: 6. DB::Exception: Received from 5.200.55.122:9000. DB::Exception: Cannot parse string 'mo' as UInt32: syntax error at begin of string. Note: there are toUInt32OrZero function, which returns zero instead of throwing exception.. 

Это ясно, clickhouse использовать toUint32 функцию строки, как «мобильный» и бросить исключение. И его совет использовать функцию toUInt32OrZero для преобразования типа.

Как я могу использовать функцию toUInt32OrZero с ALTER TABLE ??

ответ

0

Нет такого пути (насколько я знаю).

Вы можете достичь этого со вторым столом. Давайте создадим один:

CREATE TABLE main.abonents_new AS main.abonents; 

Затем мы должны изменить столбец в этой новой таблице. Эта таблица не имеет никаких данных пока, поэтому он не будет вызывать исключения:

ALTER TABLE main.abonents_new MODIFY COLUMN device_type UInt32 DEFAULT 0; 

Затем убедитесь, что новые данные не записываются в main.abonents. Мы хотели бы сохранить все на месте, когда мы перенесем данные в новую таблицу.

Вставьте данные, используя запрос INSERT INTO SELECT. Обязательно укажите все поля с одинаковым порядком; завернуть device_type функции преобразователя (toUInt32OrZero):

INSERT INTO main.abonents_new SELECT field1, field2, ..., toUInt32OrZero(device_type) AS device_type, ..., fieldN FROM main.abonents; 

Затем убедитесь, что все в порядке (что строки рассчитывать одно и то же, device_type превращали, как предполагалось, и т.д.), а затем переименовать таблицы:

RENAME TABLE main.abonents TO main.abonents_old; 
RENAME TABLE main.abonents_new TO main.abonents; 

(или, вы можете DROP вместо старой таблицы, хотя я бы сохранил старые данные, чтобы восстановить, если все идет на юг)

Смежные вопросы