mysql5.7虚拟列无法设置默认值的吗? 5C

今天使用mysql5.7.11,想对json的操作进行测试。我首先创建了一个带有json类型的表,然后对json中的某个key建立虚拟列,然后对这个虚拟列创建索引(学习网址:http://blog.csdn.net/wuzuodingfeng/article/details/53693209)。
最后我突然发现了一个问题,如何某个json中没有这个key,那么创建的索引对应的值就是NULL,这会破坏索引的效率啊。于是我想当这个key不存在的时候,给一个默认值,例如int时为0,varchar时为“”,可是我给这个虚拟列设置默认值时,一直报错,我的代码如下:

  • - 我的json串如下(json串对应的列名叫model):

[{"_id": "e030c0e8-e99a-405d-999e-71e6e0dc4f2f", "name": "优秀", "model_id": "bb3cd414-5aaa-4f5a-bf93-1c8953dc0bea", "end_score": 100, "begin_score": 439057}, {"_id": "dd59da28-f50b-4184-9589-c1fa6f7a414e", "name": "合格", "model_id": "bb3cd414-5aaa-4f5a-bf93-1c8953dc0bea", "end_score": 89}]

-- 创建虚拟列的sql

ALTER TABLE qc_model ADD begin_sore_virtual int (4) DEFAULT 0 GENERATED ALWAYS AS (json_extract(model, '$[0]."begin_score"')) VIRTUAL;

-- 创建索引的sql

ALTER TABLE qc_model INDEX begin_sore_index(begin_sore_virtual);

(感谢大家的回复)

2个回答

tiandixuanwuliang
天地炫舞 实在抱歉,我看了那篇参考文章,和我的需求不一致,没有帮助,但是还是要谢谢您的回答
2 年多之前 回复

目前这个问题已经解决,现总结解决办法如下:
1、对虚拟列是无法创建默认值的,但是可以使用ifnull函数,学习网址:http://www.nowamagic.net/academy/detail/3203050。2、建议不要给大量重复数据创建索引。下面是本人问题的解决办法,也希望大家能受用:

ALTER TABLE qc_model ADD begin_sore_virtual int (4) GENERATED ALWAYS AS (**IFNULL**(json_extract(model, '$[0]."begin_score"'),0)) VIRTUAL;

tiandixuanwuliang
天地炫舞 请注意,上述IFNULL函数是没有两边的星号的,本人在编写时点击了加粗,但是没效果,正确的写法如下:ALTER TABLE qc_model ADD begin_sore_virtual int (4) GENERATED ALWAYS AS (IFNULL(json_extract(model, '$[0]."begin_score"'),0)) VIRTUAL;
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问