clickhouse中Nullable与非空字段的建表与类型互转方式
背景
有些表随着业务发展会涉及字段的约束修改
1、历史数据字段容许为空 ,但现在要求不能为空了;
2、原类型不允许为空,但现在允许可以为空了。
drop table default.tttt CREATE TABLE default.tttt( id String, name String ) ENGINE = MergeTree PARTITION BY id ORDER BY id SETTINGS index_granularity = 8192
尝试插入数据
insert into `default`.tttt values ('0',null)-- 失败
DB::Exception: Expression returns value NULL, that is out of range of type String, at: null)
insert into `default`.tttt values ('1','name1'),('2','name2') --成功
select * from `default`.tttt
id|name |
--|-----|
2 |name2|
1 |name1|
尝试由Nullable转换成非空类型
alter table `default`.tttt MODIFY COLUMN name Nullable(String) --成功
插入一个空值,用于后面的测试:
insert into `default`.tttt values ('3',null) --成功
select * from `default`.tttt
id|name |
--|-----|
2 |name2|
1 |name1|
3 | |
再尝试由Nullable转换成非空类型
alter table `default`.tttt MODIFY COLUMN name String --失败,因为记录中存在null值
DB::Exception: Cannot convert NULL value to non-Nullable type (version 19.9.2.4 (official build))
CREATE TABLE default.tttt2( id Nullable(String), name Nullable(String) ) ENGINE = MergeTree PARTITION BY id ORDER BY id SETTINGS index_granularity = 8192
创建失败,允许为空值不能用于排序 DB::Exception: Sorting key cannot contain nullable columns (version 19.9.2.4 (official build))
CREATE TABLE default.tttt2( id String, name Nullable(String) ) ENGINE = MergeTree PARTITION BY id ORDER BY id SETTINGS index_granularity = 8192 --成功 --直接用空表转换类型 alter table `default`.tttt2 MODIFY COLUMN name String --成功。
结论
1、空表,Nullable与非空类型可以互转;
2、Nullable字段,如果记录不带有Null值,可以从Nullable转成非空类型;
3、含有null值的字段不允许转成非空类型;
4、Nullable字段不允许用于order by;
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
MySQL插入数据insert ignore语法重复数据自动忽略
这篇文章主要给大家介绍了关于MySQL插入数据insert ignore语法重复数据自动忽略的相关资料,最近工作中使用到了insert ignore into语法,感觉这个语法还是挺有用的,就记录下来做个总结,需要的朋友可以参考下2023-08-08Ubuntu下mysql与mysql workbench安装教程
这篇文章主要为大家详细介绍了Ubuntu下mysql与mysql workbench的安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-04-04MySql插入数据成功但是报[Err] 1055错误的解决方案
这篇文章主要介绍了MySql插入数据成功但是报[Err] 1055错误的解决方案,需要的朋友可以参考下2017-08-08一步步教你在Navicat上如何停止正在运行的MYSQL语句
很多时候我们会提交一些耗时比较长的sql,可能出现mysql服务器内存或者CPU暴增,引起报警,甚至影响其他业务,下面这篇文章主要给大家介绍了关于在Navicat上如何停止正在运行的MYSQL语句的相关资料,需要的朋友可以参考下2023-03-03
最新评论