mysql的单列多值存储实例详解


Posted in MySQL onApril 05, 2022

本文主要研究一下mysql如何用一个列来存储多个值

实例

用bit类型

  • 建表及数据准备
-- 这里定义了bit(3),表示有3位,第一位1,第二位2,第三位4
create table t_bit_demo(
   id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
   multi_value bit(3) not null default 0
);

-- 这里插入了1,2,4的组合值
insert into t_bit_demo(multi_value) values(b'000');
insert into t_bit_demo(multi_value) values(b'001');
insert into t_bit_demo(multi_value) values(b'010');
insert into t_bit_demo(multi_value) values(b'011');
insert into t_bit_demo(multi_value) values(b'100');
insert into t_bit_demo(multi_value) values(b'101');
insert into t_bit_demo(multi_value) values(b'110');
insert into t_bit_demo(multi_value) values(b'111');

-- 这里直接插入int值也可以,比如5相当于101
-- insert into t_bit_demo(multi_value) values(5);

SELECT multi_value+0, BIN(multi_value) FROM t_bit_demo;
+---------------+------------------+
| multi_value+0 | BIN(multi_value) |
+---------------+------------------+
| 0             | 0                |
| 1             | 1                |
| 2             | 10               |
| 3             | 11               |
| 4             | 100              |
| 5             | 101              |
| 6             | 110              |
| 7             | 111              |
+---------------+------------------+
  • 位运算查询
-- 查询第二位有值的数据
select multi_value+0,BIN(multi_value) from t_bit_demo where multi_value & 2
+---------------+------------------+
| multi_value+0 | BIN(multi_value) |
+---------------+------------------+
| 2             | 10               |
| 3             | 11               |
| 6             | 110              |
| 7             | 111              |
+---------------+------------------+

-- 查询第三位有值的数据
select multi_value+0,BIN(multi_value) from t_bit_demo where multi_value & 4
+---------------+------------------+
| multi_value+0 | BIN(multi_value) |
+---------------+------------------+
| 4             | 100              |
| 5             | 101              |
| 6             | 110              |
| 7             | 111              |
+---------------+------------------+

-- 查询只有第三位有值的数据
select multi_value+0,BIN(multi_value) from t_bit_demo where multi_value = 4
select multi_value+0,BIN(multi_value) from t_bit_demo where multi_value = 4
+---------------+------------------+
| multi_value+0 | BIN(multi_value) |
+---------------+------------------+
| 4             | 100              |
+---------------+------------------+
  • 更新
select id,multi_value+0,BIN(multi_value) from t_bit_demo
+----+---------------+------------------+
| id | multi_value+0 | BIN(multi_value) |
+----+---------------+------------------+
| 1  | 0             | 0                |
| 2  | 1             | 1                |
| 3  | 2             | 10               |
| 4  | 3             | 11               |
| 5  | 4             | 100              |
| 6  | 5             | 101              |
| 7  | 6             | 110              |
| 8  | 7             | 111              |
+----+---------------+------------------+

-- 将id为7的值移除第二个枚举
update t_bit_demo set multi_value = b'100' where id=7
select id,multi_value+0,BIN(multi_value) from t_bit_demo where id=7
+----+---------------+------------------+
| id | multi_value+0 | BIN(multi_value) |
+----+---------------+------------------+
| 7  | 4             | 100              |
+----+---------------+------------------+

用int/bigint类型

  • 建表及数据准备
create table t_bigint_demo(
   id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
   multi_value bigint not null default 0
);

-- 假设这里定义了1,2,4三个枚举值
insert into t_bigint_demo(multi_value) values(0);
insert into t_bigint_demo(multi_value) values(1);
insert into t_bigint_demo(multi_value) values(2);
insert into t_bigint_demo(multi_value) values(3);
insert into t_bigint_demo(multi_value) values(4);
insert into t_bigint_demo(multi_value) values(5);
insert into t_bigint_demo(multi_value) values(6);
insert into t_bigint_demo(multi_value) values(7);

select multi_value from t_bigint_demo
+-------------+
| multi_value |
+-------------+
| 0           |
| 1           |
| 2           |
| 3           |
| 4           |
| 5           |
| 6           |
| 7           |
+-------------+
  • 查询
-- 查询包含第二个枚举的数据
select multi_value,BIN(multi_value) from t_bigint_demo where multi_value & 2
+-------------+------------------+
| multi_value | BIN(multi_value) |
+-------------+------------------+
| 2           | 10               |
| 3           | 11               |
| 6           | 110              |
| 7           | 111              |
+-------------+------------------+

-- 查询包含第三个枚举的数据
select multi_value,BIN(multi_value) from t_bigint_demo where multi_value & 4
+-------------+------------------+
| multi_value | BIN(multi_value) |
+-------------+------------------+
| 4           | 100              |
| 5           | 101              |
| 6           | 110              |
| 7           | 111              |
+-------------+------------------+

-- 查询值为第三个枚举的数据
select multi_value,BIN(multi_value) from t_bigint_demo where multi_value =4
+-------------+------------------+
| multi_value | BIN(multi_value) |
+-------------+------------------+
| 4           | 100              |
+-------------+------------------+
  • 更新
select id,multi_value,BIN(multi_value) from t_bigint_demo
+----+-------------+------------------+
| id | multi_value | BIN(multi_value) |
+----+-------------+------------------+
| 1  | 0           | 0                |
| 2  | 1           | 1                |
| 3  | 2           | 10               |
| 4  | 3           | 11               |
| 5  | 4           | 100              |
| 6  | 5           | 101              |
| 7  | 6           | 110              |
| 8  | 7           | 111              |
+----+-------------+------------------+

-- 将id为7的值移除第二个枚举
update t_bigint_demo set multi_value = b'100' where id=7
select id,multi_value,BIN(multi_value) from t_bigint_demo where id=7
+----+-------------+------------------+
| id | multi_value | BIN(multi_value) |
+----+-------------+------------------+
| 7  | 4           | 100              |
+----+-------------+------------------+

用varchar类型

  • 建表及数据准备
create table t_varchar_demo(
   id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
   multi_value varchar(255) not null default ''
);

-- 假设这里定义了1,2,4三个枚举值
insert into t_varchar_demo(multi_value) values('1');
insert into t_varchar_demo(multi_value) values('2');
insert into t_varchar_demo(multi_value) values('1,2');
insert into t_varchar_demo(multi_value) values('4');
insert into t_varchar_demo(multi_value) values('1,4');
insert into t_varchar_demo(multi_value) values('2,4');
insert into t_varchar_demo(multi_value) values('1,2,4');

select multi_value from t_varchar_demo
+-------------+
| multi_value |
+-------------+
| 1           |
| 2           |
| 1,2         |
| 4           |
| 1,4         |
| 2,4         |
| 1,2,4       |
+-------------+
  • 查询
-- 查询包含第二个枚举的数据
select multi_value from t_varchar_demo where find_in_set('2',multi_value)
+-------------+
| multi_value |
+-------------+
| 2           |
| 1,2         |
| 2,4         |
| 1,2,4       |
+-------------+

-- 查询包含第三个枚举的数据
select multi_value from t_varchar_demo where find_in_set('4',multi_value)
+-------------+
| multi_value |
+-------------+
| 4           |
| 1,4         |
| 2,4         |
| 1,2,4       |
+-------------+

-- 查询只有第三个枚举的数据
select multi_value from t_varchar_demo where multi_value = '4'
+-------------+
| multi_value |
+-------------+
| 4           |
+-------------+
  • 更新
select * from t_varchar_demo
+----+-------------+
| id | multi_value |
+----+-------------+
| 1  | 1           |
| 2  | 2           |
| 3  | 1,2         |
| 4  | 4           |
| 5  | 1,4         |
| 6  | 2,4         |
| 7  | 1,2,4       |
+----+-------------+

-- 将id为7的值移除第二个枚举
update t_varchar_demo set multi_value = '1,4' where id=7
select * from t_varchar_demo where id=7
+----+-------------+
| id | multi_value |
+----+-------------+
| 7  | 1,4         |
+----+-------------+

用set类型

  • 建表及数据准备
create table t_set_demo(
   id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
   multi_value set('1','2','4') not null default ''
);

insert into t_set_demo(multi_value) values('');
insert into t_set_demo(multi_value) values('1');
insert into t_set_demo(multi_value) values('2');
insert into t_set_demo(multi_value) values('1,2');
insert into t_set_demo(multi_value) values('4');
insert into t_set_demo(multi_value) values('1,4');
insert into t_set_demo(multi_value) values('2,4');
insert into t_set_demo(multi_value) values('1,2,4');
  • 查询
-- 查询包含第二个枚举的数据,可以用位运算也可以用find_in_set
select multi_value from t_set_demo where multi_value&2
select multi_value from t_set_demo where find_in_set('2',multi_value)
+-------------+
| multi_value |
+-------------+
| 2           |
| 1,2         |
| 2,4         |
| 1,2,4       |
+-------------+

-- 查询包含第三个枚举的数据,可以用位运算也可以用find_in_set
select multi_value from t_set_demo where multi_value&4
select multi_value from t_set_demo where find_in_set('4',multi_value)
+-------------+
| multi_value |
+-------------+
| 4           |
| 1,4         |
| 2,4         |
| 1,2,4       |
+-------------+

-- 查询值为第三个枚举的数据
select multi_value from t_set_demo where multi_value='4'
+-------------+
| multi_value |
+-------------+
| 4           |
+-------------+
  • 更新
select * from t_set_demo
+----+-------------+
| id | multi_value |
+----+-------------+
| 1  |             |
| 2  | 1           |
| 3  | 2           |
| 4  | 1,2         |
| 5  | 4           |
| 6  | 1,4         |
| 7  | 2,4         |
| 8  | 1,2,4       |
+----+-------------+

-- 将id为7的值移除第二个枚举
update t_set_demo set multi_value = '1,4' where id=7
select * from t_set_demo where id=7
select * from t_set_demo where id=7
+----+-------------+
| id | multi_value |
+----+-------------+
| 7  | 1,4         |
+----+-------------+

小结

mysql用单列存储多值通常用于一对多的反范式处理,具体可以用bit、int/bigint、varchar、set类型来实现,缺点是不支持索引。

doc

到此这篇关于mysql单列多值存储的文章就介绍到这了,更多相关mysql单列多值存储内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
详解Mysql 函数调用优化
Apr 07 MySQL
MySQL命令行操作时的编码问题详解
Apr 14 MySQL
虚拟机linux端mysql数据库无法远程访问的解决办法
May 26 MySQL
MySQL下使用Inplace和Online方式创建索引的教程
May 26 MySQL
MySQL连接查询你真的学会了吗?
Jun 02 MySQL
MySQL中datetime时间字段的四舍五入操作
Oct 05 MySQL
深入讲解数据库中Decimal类型的使用以及实现方法
Feb 15 MySQL
面试提问mysql一张表到底能存多少数据
Mar 13 MySQL
为什么MySQL8新特性会修改自增主键属性
Apr 18 MySQL
MySql如何将查询的出来的字段进行转换
Jun 14 MySQL
MySQL一劳永逸永久支持输入中文的方法实例
Aug 05 MySQL
MySQL 原理优化之Group By的优化技巧
Aug 14 MySQL
详细聊一聊mysql的树形结构存储以及查询
mysql查询结果实现多列拼接查询
Apr 03 #MySQL
mysql使用instr达到in(字符串)的效果
数据分析数据库ClickHouse在大数据领域应用实践
Apr 03 #MySQL
一文了解MYSQL三大范式和表约束
MYSQL优化之数据表碎片整理详解
Innodb存储引擎中的后台线程详解
Apr 03 #MySQL
You might like
PHP实现文件下载详解
2014/11/27 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
PHP反射实际应用示例
2019/04/03 PHP
Dojo之路:如何利用Dojo实现Drag and Drop效果
2007/04/10 Javascript
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
2012/01/08 Javascript
Javascript玩转继承(二)
2014/05/08 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
AngularJS基础 ng-csp 指令详解
2016/08/01 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
详解React+Koa实现服务端渲染(SSR)
2018/05/23 Javascript
基于JS实现一个随机生成验证码功能
2019/05/29 Javascript
javascript中的闭包概念与用法实践分析
2019/07/26 Javascript
Python处理字符串之isspace()方法的使用
2015/05/19 Python
基于python实现KNN分类算法
2020/04/23 Python
Python多线程同步---文件读写控制方法
2019/02/12 Python
Python调用C/C++的方法解析
2020/08/05 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
台湾三立电视电商平台:电电购
2019/09/09 全球购物
EMPHASIS艾斐诗官网:周生生旗下原创精品珠宝品牌
2020/12/17 全球购物
DataList 能否分页,请问如何实现?
2015/05/03 面试题
初中生自我评价
2014/02/01 职场文书
客运企业隐患排查工作方案
2014/06/06 职场文书
会计主管岗位职责
2015/04/02 职场文书
2015年市场部工作总结
2015/04/30 职场文书
标枪加油稿
2015/07/22 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书
PostgreSQL将数据加载到buffer cache中操作方法
2021/04/16 PostgreSQL
javascript遍历对象的五种方式实例代码
2021/10/24 Javascript
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript
win11电脑关机鼠标灯还亮怎么解决? win11关机后鼠标灯还亮解决方法
2023/01/09 数码科技