Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > clickhouse中Nullable与非空字段的建表与类型互转

clickhouse中Nullable与非空字段的建表与类型互转方式

作者:阿爵

这篇文章主要介绍了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;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文