MySQL原生JSON格式的简单使用

MySQL 5.7+ 开始支持原生JSON,可以对JSON格式的内容进行插入校验,以及对其内部字段单独查询,推荐对JSON内容使用JSON格式。

-- 创建表
CREATE TABLE t (
id int(11) DEFAULT NULL,
info json DEFAULT NULL
);

-- 插入校验
INSERT INTO t(id, info) VALUES (1, '{"name": "Jack", "age": 28}'); -- 插入成功
-- INSERT INTO t(id, info) VALUES (2, 'xxxxxx'); -- 插入失败,Invalid JSON text

-- 只查询info里面的name字段
SELECT info->'$.name' FROM t WHERE id=1; -- Jack 注意,$.name的引号不能省略
-- 或者
SELECT json_extract(info, '$.name') FROM t WHERE id=1; -- Jack

此外,可以对JSON内部的字段创建虚列,虚列的值可以根据JSON的内容自动更新,像普通列一样查询(但是不能插入和更新),以及创建索引
-- 创建虚列
ALTER TABLE t ADD username varchar(10) GENERATED ALWAYS AS (info->'$.name') VIRTUAL;
-- 或者 ALTER TABLE t ADD username varchar(10) GENERATED ALWAYS AS (json_extract(info, '$.name)) VIRTUAL;

-- 虚列可以像普通列一样查询
SELECT username FROM t WHERE id=1; -- Jack

-- 插入JSON时,自动生成虚列的值
INSERT INTO t(id, info) VALUES (2, '{"name": "Lily", "age": 26}');
SELECT username FROM t WHERE id=2; -- Lily

-- 更改JSON内容,虚列值自动更新
UPDATE t SET info='{"name": "Lucy", "age": 26}' WHERE id=2;
SELECT username FROM t WHERE id=2; -- Lucy

-- 不允许更新虚列的值
-- UPDATE t SET username='Tom' WHERE id=2; -- The value specified for generated column 'username' in table 't' is not allowed.

-- 可以给序列创建索引,就像普通列一样
ALTER TABLE t ADD INDEX idx_username(username);

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

| 1 | SIMPLE | t | NULL | ref | idx_username | idx_username | 33 | const | 1 | 100.00 | NULL |

相关推荐