如何使用clickhouse中的toUInt32OrZero函数更改列类型?

时间:2016-11-15 15:08:40

标签: clickhouse

我在clickhouse表中有String列。 我尝试将修改类型的alter table改为UInt32:

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在'mobile'这样的字符串上使用toUint32函数并抛出异常。并建议使用函数toUInt32OrZero来转换类型。

如何在ALTER TABLE ??

中使用toUInt32OrZero函数

1 个答案:

答案 0 :(得分: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使用较旧的表格;但我会保留旧数据,以便在事情向南移动时能够恢复