MySQL 创建一个json类型的字段, 同时创建一个对应的就是 JSON 中的内容,是个虚拟列

创建表的时候,就完成虚拟列及函数索引的创建。如下表创建的列 cellphone 对应的就是 JSON 中的内容,是个虚拟列;uk_idx_cellphone 就是在虚拟列 cellphone 上所创建的索引。

CREATE TABLE UserLogin (
    userId BIGINT,
    loginInfo JSON,
    cellphone VARCHAR(255) AS (loginInfo->>"$.cellphone"),
    PRIMARY KEY(userId),
    UNIQUE KEY uk_idx_cellphone(cellphone)
)

插入下面的数据:

SET @a = '
{
   "cellphone" : "13918888888",
   "wxchat" : "破产码农",
   "QQ" : "82946772"
}
';

INSERT INTO UserLogin VALUES (1,@a);

SET @b = '
{
  "cellphone" : "15026888888"
}
';

INSERT INTO UserLogin VALUES (2,@b);

查询语句

SELECT 
    userId,
    loginInfo->>"$.cellphone" cellphone,
    loginInfo->>"$.wxchat" wxchat
FROM UserLogin;

+--------+-------------+--------------+
| userId | cellphone   | wxchat       |
+--------+-------------+--------------+
|      1 | 13918888888 | 破产码农     |
|      2 | 15026888888 | NULL         |
+--------+-------------+--------------+
2 rows in set (0.01 sec)

cellphone 虚拟列 的值 会 随着 loginInfo 字段里面的 cellphone 的值自动变化更新

问下,这个 cellphone 字段 用 migration 应该是怎么去创建?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案
$table->json('info');
$table->string('info_phone')->unique()->virtualAs('info->>"$.phone"');
2年前 评论
讨论数量: 4

标题的意思是 MySQL 创建一个json类型的字段, 同时创建一个虚拟列对应的是 JSON 中的内容 吗? :flushed:

2年前 评论
gyp719 (楼主) 2年前
zhuzixian520

您好,我觉得你可以直接在 migration 中使用 sql 语句来构建,我觉得没什么大不了的,虚拟列也是有sql语句的,migration中如果没有提供的对象方法,应该可以写原生sql代替那个字段

刚刚我又测试了一下,确实没问题的,希望能对您有帮助,我用的是yii2 框架的 migration,laravel的应该也是原理类似

Laravel

Laravel

Laravel

2年前 评论
$table->json('info');
$table->string('info_phone')->unique()->virtualAs('info->>"$.phone"');
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!