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