JSON 数据的使用
首先有一张 test 表,content 字段保存的是 JSON 数据。
1 2 3 4 5 6
| CREATE TABLE `test` ( `id` int NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `content` json NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB;
|
插入几条测试数据
1 2 3 4 5
| INSERT INTO test VALUES ( NULL, '标题1', '{ "key1" : "内容1", "key2" : "内容1", "123" : "内容1" }' ), ( NULL, '标题2', '{ "key1" : "内容2", "key2" : "内容2", "123" : "内容2" }' ), ( NULL, '标题3', '{ "key1" : "内容3", "key2" : "内容3", "123" : "内容3" }' );
|
查询字段 key1 为“内容1”的数据,这里使用JSON_EXTRACT(),更多点击:MySQL 官方文档
1
| SELECT * FROM test WHERE JSON_EXTRACT(content,'$.key1')='内容1';
|
查询字段为“123”的内容为“内容1”的数据
因为字段为纯数字,所以需要加双引号(“”)
1
| SELECT * FROM test WHERE JSON_EXTRACT(content,'$."123"')='内容1';
|
为 JSON 内部字段 key1 加索引
第一步:添加虚拟字段
1
| ALTER TABLE test ADD COLUMN `key1_virtual` VARCHAR (20) GENERATED ALWAYS AS (json_unquote(json_extract(content,'$.key1'))) VIRTUAL;
|
第二步:创建索引
1
| ALTER TABLE test ADD INDEX `idx_key1`(key1_virtual) USING BTREE;
|
测试
1
| EXPLAIN SELECT * from test where key1_virtual='内容1';
|
结果如下,idx_key1 索引生效了
1 2 3 4 5 6
| +----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+ | 1 | SIMPLE | test | NULL | ref | idx_key1 | idx_key1 | 83 | const | 1 | 100.00 | NULL | +----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+ 1 row in set (0.00 sec)
|
另外还有一种添加索引的方法:查看
参考文章:
https://developer.aliyun.com/article/303208
mysql更新 A 表的字段等于 B 表的字段
1 2 3 4 5 6 7 8
| UPDATE article a1, article a2 SET a1.name1 = a2.name WHERE a1.id = a2.id AND a1.name1 = '' AND a2.name1 = '';
|