1

我在 clickhouse 表中有字符串列。我尝试将修改类型更改为 UInt32 的表:

ALTER TABLE main.abonents
修改栏目
设备类型 UInt32 默认 0

但有错误:

 
从服务器收到异常:
代码:6. DB::Exception:从 5.200.55.122:9000 接收。DB::Exception:无法将字符串“mo”解析为 UInt32:字符串开头的语法错误。注意:有 toUInt32OrZero 函数,它返回零而不是抛出异常..

很明显,clickhousetoUint32在像“mobile”这样的字符串上使用函数并抛出异常。以及使用函数toUInt32OrZero转换类型的建议。

如何使用toUInt32OrZeroALTER TABLE 的功能?

4

1 回答 1

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用旧表代替;尽管如果事情不顺利,我会保留旧数据以便能够恢复)

于 2016-11-20T08:00:15.390 回答