Mysql中FIND_IN_SET和REPLACE函数简介
一 FIND_IN_SET()
SELECT * from u_user where FIND_IN_SET('32',tags)
上面的sql是精确查找,查找表中tags中含有32的记录(注意这里的含有不是说13268这样也是含有,而是23,32,35,36这样才是含有),只有当tags这一列中记录是用逗号分开中的tags含有32.不能够说查找("32,33",tags)这种写法是查不到上面的结果,例如
这样的字段: 9791, 2336, 726, 728, 1466, 6843, 1501, 6293, 6522
FIND_IN_SET('23',tags)是可以查到这两行数据,FIND_IN_SET("22,23",tags)查不到这两行数据.
FIND_IN_SET()和IN的区别
select * from table where id IN (columnName);
实际上这样是不行的,这样只有当id是columnName中的第一个元素时,查询才有效,否则都的不到结果,即使id真的再columnName中
再来看看这个:
select * from table where id IN (23, 32, 36);
总结:所以如果columnName是常量,则可以直接用IN, 变量要用FIND_IN_SET()函数,FIND_IN_SET()是精确查找
二 REPLACE()
语法:replace(object,search,replace)
语义:把object对象中出现的的search全部替换成replace。
实例:
update hellotable set 'helloCol' = replace('helloCol','helloSearch','helloReplace')
update TABLE_NAME set COLUMN_NAME=REPLACE(COLUMN_NAME,"from_str","to_str") where conditions
replace into函数
为什么会接触到replace into函数,是因为业务需要向数据库中插入数据,前提是重复的不能再次插入。以前用where解决的,今天才知道还有一个更简洁的方法replace。
replace具备替换拥有唯一索引或者主键索引重复数据的能力,也就是如果使用replace into插入的数据的唯一索引或者主键索引与之前的数据有重复的情况,将会删除原先的数据,然后再进行添加。
语法:replace into table( col1, col2, col3 ) values ( val1, val2, val3 )
语义:向table表中col1, col2, col3列replace数据val1,val2,val3
实例:
REPLACE INTO users (id,name,age) VALUES(123, ‘chao’, 50);
唯一的组合索引
因为在创建索引的时候发现很多问题,放在这儿做一下记录。
首先我们使用replace的原因就是因为它有“防重”的作用,但是它的“防重”作用仅仅是局限在唯一索引上或者主键索引上。所以我们使用replace时必须要有一个唯一索引。
而业务的逻辑需要四个字段唯一确定一条记录,也就是说我要建立一个组合索引也即多列索引。
最终确定需求就是我要create出一个unique的组合索引,很简单是不是,后面讲坑。。。
先讲讲组合(多列)索引是什么鬼?!
组合索引的生效原则是 从前向后依次生效,如果中间某个索引没有使用, 那么断点前面的索引部分起作用,断点后面的索引没有起作用,即最左优先原则
例如创建多列索引(a,b,c)
where a=3 and b=45 and c=5...
这种三个索引顺序使用中间没有断点,全部发挥作用; where a=3 and c=5...
这种情况下b就是断点,a发挥了效果,c没有效果; where b=3 and c=4...
这种情况下a就是断点,在a后面的索引都没有发挥作用,这种写法联合索引没有发挥任何效果; where b=45 and a=3 and c=5...
这个跟第一个一样,全部发挥作用,abc只要用上了就行,跟写的顺序无关;
如何创建组合索引
语法:CREATE UNIQUE INDEX index ON table( col1, col2, col3 )
实例:CREATE UNIQUE INDEX index_unique ON app(pkgName,version,device,osver)
很简单是不是,但是我还是遇到了两个坑,浪费了我一下午,第一个坑就是创建的索引长度是有限制的,不能超过767,发现字段的长度也用不了varchar(256)于是改成了varchar(100)。
你以为这样就OK了,NAIVE!第二个坑,“error: Duplicate etry ~”,英文不好真的很费劲,我翻译出来“重复实例”,却还是没能理解是什么意思,还一味的排除sql语句的错误。。。直到逛了外网论坛才发现是表的问题,因为在创建这个唯一索引的时候表中已经有很多重复数据了,所以很肯定创建不成功!
清空表数据,完美。。。
Mysql中FIND_IN_SET和REPLACE函数简介的更多相关文章
- mysql中FIND_IN_SET函数用法
本篇文章主要介绍mysql中FIND_IN_SET函数用法,用来精确查询字段中以逗号分隔的数据 以及其与 like 和 in 的区别 1.问题发现 之前在做工作任务时有这么一个需求:需要用接口所传的服 ...
- mysql中的去除空格函数
(1)mysql replace 函数 语法:replace(object,search,replace) 意思:把object中出现search的全部替换为replace 案例:update `ne ...
- mysql 中find_in_set()和in()用法比较
mysql 中find_in_set()和in()用法比较 在mysql中in可以包括指定的数字,而find_in_set()用于特定的数据类型. find_in_set 函数使用方法 个例子来说:有 ...
- mysql中FIND_IN_SET()和GROUP_CONCAT()的使用
知识点:mysql中FIND_IN_SET和GROUP_CONCAT()的使用 (一) 场景:当我们使用mysql数据库,查询一张的数据,其中的一列存放的是是另一张表id用“,”拼接的字符串 如下图所 ...
- Mysql中FIND_IN_SET()和IN区别简析
来源:http://www.jb51.net/article/125744.htm 测试SQL: CREATE TABLE `test` ( `id` int(8) NOT NULL auto_inc ...
- mysql中bit_count和bit_or函数的含义
翻阅mysql手册时,看到有个示例使用了bit_or方法来去除重复的数据,一开始没看明白,后来看明白之后感觉非常巧妙.示例要实现的功能就是计算每月有几天有访问,先把示例摘录在这里. 1 2 3 4 5 ...
- mysql 中时间和日期函数应用
一.MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间(date + time)函数:now() mysql> select now(); +-------------------- ...
- mysql 中 时间和日期函数
From: http://www.cnblogs.com/redfox241/archive/2009/07/23/1529092.html 一.MySQL 获得当前日期时间 函数 1.1 获得当前日 ...
- mysql中find_in_set()函数的使用
首先举个例子来说: 有个文章表里面有个type字段,它存储的是文章类型,有 1头条.2推荐.3热点.4图文等等 .现在有篇文章他既是头条,又是热点,还是图文,type中以 1,3,4 的格式存储.那我 ...
随机推荐
- vue视频: 自定义指令 && 拖拽 && 自定义键盘信息
v-textv-forv-html 指令: 扩展html语法 自定义指令:1. 自定义属性指令: Vue.directive(指令名称,function(参数){ this.el -> 原生DO ...
- Oracle安装部署之 timesten install on redhat6.5
一.安装前检查 [root@localhost ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 6.5 (San ...
- Andrew Ng机器学习公开课笔记 -- Logistic Regression
网易公开课,第3,4课 notes,http://cs229.stanford.edu/notes/cs229-notes1.pdf 前面讨论了线性回归问题, 符合高斯分布,使用最小二乘来作为损失函数 ...
- 当IDENTITY_INSERT设置为OFF时不能向表插入显示值。(源:MSSQLServer,错误码:544)
错误提示"事务和快照同步时提示:当IDENTITY_INSERT设置为OFF时不能向表插入显示值.(源:MSSQLServer,错误码:544)" 原因:在SQL2008同步时到S ...
- 005-spring cache-配置缓存存储
一.概述 缓存抽象提供了多种存储集成.要使用它们,需要简单地声明一个适当的CacheManager - 一个控制和管理Caches的实体,可用于检索这些实体以进行存储. 1.1.基于JDK Concu ...
- Controller中返回数据总结(ResponseEntity,@ResponseBody,@ResponseStatus)
在传统的开发过程中,我们的控制CONTROLLER层通常需要转向一个JSP视图:但随着WEB2.0相关技术的崛起,我们很多时候只需要返回数据即可,而不是一个JSP页面. ResponseEntity: ...
- mysql性能测试-tpcc
mysql性能测试-tpcc Tpcc-mysql TPC-C是专门针对联机交易处理系统(OLTP系统)的规范 Tpcc-mysql由percona根据规范实现 TPCC流程 更能模拟线上业务 ...
- SQL Server与Oracle对表添加列的不同点
逛了博客园两年有余,不知道该发表些什么.要么觉得自己太菜,要么觉得要发的内容都可以搜索到,发表了还颇有抄袭味道.想想后都不得了之了. 搞了开发快一年了,有时候零零碎碎的东西需要整理一下,梳理后才能做到 ...
- Learning to Rank之RankNet算法简介
排序一直是信息检索的核心问题之一, Learning to Rank(简称LTR)用机器学习的思想来解决排序问题(关于Learning to Rank的简介请见我的博文Learning to Rank ...
- Android ActionBar自定义
关于自定义的ActionBar的实现过程,这里做下笔记以供之后查看. 1.默认状态 使用Android Studio新建一个名为“ActionBar”的应用,默认actionbar如图(1)所示. 图 ...