【问题标题】:How alter column type with using toUInt32OrZero function in clickhouse?如何在 clickhouse 中使用 toUInt32OrZero 函数更改列类型?
【发布时间】:2017-03-29 12:54:24
【问题描述】:

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

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

但有错误:

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

很明显,clickhouse 使用toUint32 函数对'mobile' 之类的字符串并抛出异常。以及使用函数toUInt32OrZero 转换类型的建议。

如何将toUInt32OrZero 函数与 ALTER TABLE 一起使用??

【问题讨论】:

    标签: clickhouse


    【解决方案1】:

    没有这样的方法(据我所知)。

    您可以使用第二张桌子来实现它。让我们创建一个:

    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 旧表代替;虽然我会保留旧数据以便在事情恶化时能够恢复)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-02
      • 2020-08-10
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多