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数据库使用UTF-8中文编码乱码的解决办法
May 26 MySQL
Mysql 设置boolean类型的操作
Jun 04 MySQL
MySQL 使用索引扫描进行排序
Jun 20 MySQL
Mysql数据库值的添加、修改、删除及清空操作实例
Jun 20 MySQL
MySql 8.0及对应驱动包匹配的注意点说明
Jun 23 MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 MySQL
教你如何让spark sql写mysql的时候支持update操作
Feb 15 MySQL
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
Mar 22 MySQL
深入理解mysql事务隔离级别和存储引擎
Apr 12 MySQL
Mysql排查分析慢sql之explain实战案例
Apr 19 MySQL
Mysql 数据库中的 redo log 和 binlog 写入策略
Apr 26 MySQL
面试官问我Mysql的存储引擎了解多少
Aug 05 MySQL
详细聊一聊mysql的树形结构存储以及查询
mysql查询结果实现多列拼接查询
Apr 03 #MySQL
mysql使用instr达到in(字符串)的效果
数据分析数据库ClickHouse在大数据领域应用实践
Apr 03 #MySQL
一文了解MYSQL三大范式和表约束
MYSQL优化之数据表碎片整理详解
Innodb存储引擎中的后台线程详解
Apr 03 #MySQL
You might like
全国中波电台频率表
2020/03/11 无线电
PHP 中的类
2006/10/09 PHP
深入解析PHP的引用计数机制
2013/06/14 PHP
PHP基于CURL进行POST数据上传实例
2014/11/10 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
php通过curl模拟登陆DZ论坛
2015/05/11 PHP
innerText和innerHTML 一些问题分析
2009/05/18 Javascript
Tab切换组件(选项卡功能)实例代码
2013/11/21 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
nodejs教程之制作一个简单的文章发布系统
2014/11/21 NodeJs
js禁止页面刷新与后退的方法
2015/06/08 Javascript
详解JavaScript的策略模式编程
2015/06/24 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
JavaScript Math 对象常用方法总结
2016/04/28 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
使用nodejs下载风景壁纸
2017/02/05 NodeJs
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
微信小程序微信支付接入开发实例详解
2017/04/12 Javascript
vue中的数据绑定原理的实现
2018/07/02 Javascript
JavaScript日期工具类DateUtils定义与用法示例
2018/09/03 Javascript
深入理解Vue 的钩子函数
2018/09/05 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
Python编程实现及时获取新邮件的方法示例
2017/08/10 Python
pycharm中显示CSS提示的知识点总结
2019/07/29 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
Flask项目中实现短信验证码和邮箱验证码功能
2019/12/05 Python
numba提升python运行速度的实例方法
2021/01/25 Python
python opencv实现图像配准与比较
2021/02/09 Python
Canvas实现保存图片到本地的示例代码
2018/06/28 HTML / CSS
波兰最早的运动鞋精品店之一:Street Supply
2019/08/29 全球购物
《画家和牧童》教学反思
2016/02/17 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
2021/05/06 MySQL
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python
Mysql忘记密码解决方法
2022/02/12 MySQL
apache虚拟主机配置的三种方式(小结)
2022/07/23 Servers