mysql
陌下微尘
这个作者很懒,什么都没留下…
展开
-
分页查询<resultMap>中有<collection>每页条数问题
1. 使用mybatis + pageHelper去查询,<resultMap>标签中有一对多的<collection>数据时,会造成分页数据不足给定预期条数。那么可以通过其他的方式来解决这种问题:1)方法1:单独写一个select 做关联查询,collection有一个select属性和column属性,https://github.com/pagehelper/Mybatis-PageHelper/issues/1852)方法2:主数据分开分页查,其他关联数据在业务层原创 2020-09-02 16:33:28 · 2904 阅读 · 0 评论 -
mysql批量插入防重复
防重复插入大致有以下几种:insert ignore into: 结合主键或者唯一索引on duplicate key updateinsert into… select … where not existsreplace into注意:这里主要对<foreach> 中separator用union all<insert id="insertBatch"> insert into t_activity_obj (activity_id, tar...原创 2020-08-13 15:47:43 · 578 阅读 · 0 评论 -
mysql按某字段指定的值进行排序
举个栗子:假如一个商品下,有多个货品,各个货品的状态值都不一样,那么当只想展示商品中的某一个货品时,希望用户端看到的优先级是在售的货品中的一个,根据mysql提供的方法:field(column,value1,value2,value3,……), 可满足当前需求.如:order by field(onshelf_status, 'ON_SHELF','OFF_SHELF','FORCE_OFF_SHELF','WAIT_AUDIT') asc limit 1;...原创 2020-07-27 12:09:37 · 3115 阅读 · 0 评论 -
有条件的count()
1. 通常情况下只需要:select count(distinct o.shop_id) as shopCount2. 只统计已结算的,即有条件的情况:巧妙借助null,以及distinct的位置select count(distinct if(o.settle_status = 1, o.shop_id, null)) as settleShopCount...原创 2020-01-06 10:08:06 · 859 阅读 · 1 评论 -
数据库枚举
描述:1. 同事数据库表设计时,有个字段的类型使用了枚举类型,并给定了默认的枚举类型;后来因为业务的扩展,增加了其他的枚举类型,在java中加了后,没有同步在数据库表的该字段。后来插入新值的枚举类型的数据记录市,报错:Data truncated for column1. 这个错误有点莫名其妙,初一看,以为是数据重复的限制造成的,但一查,并无相同类型的数据。2. 后来看了看库表的字段结...原创 2019-12-30 15:18:32 · 1011 阅读 · 0 评论 -
数据库表关键字段问题
1. 如果涉及库表时,不小心使用了数据库的关键字,则当使用TK(Mapper)自带的Model selectBy..()方法时,关键字段无法自定义处理,导致报错:如:com.alibaba.druid.sql.parser.ParserException: ERROR. token : SHOW, pos : 462. 处理方法:1) 将表中的关键字改名2) 将使用自定义的select...原创 2019-10-31 09:55:25 · 904 阅读 · 0 评论 -
mysql死锁
1. 产生如题数据库死锁问题:1) update时,如果where条件里面涉及多个字段,区分度都比较高且字段都分别建了索引的话,mysql会多个索引各走一遍,然后结果取个交集;单条记录更新不会引发问题; 多条记录并发更新时,如果索引行数有重叠,因加锁顺序可能不同,互相等待可能会导致死锁,为什么加锁顺序会不同呢?我们的sql中where条件的顺序是一定的,那么加锁顺序也应该一定,为什么会有加...原创 2019-09-25 17:49:40 · 180 阅读 · 0 评论 -
if test == 的坑
遇到了一个坑,处理方式参考如下:https://blog.csdn.net/xl19961223/article/details/81362696原创 2019-09-08 15:30:04 · 1451 阅读 · 0 评论 -
mybatis先排序后分组
1. 一个统计数据的需求是取每个月数据,并展示当月的总值;因为展示该月总值的话,需要展示该月中记录时间最大的作为展示;故先要进行排序后再分组;select if(sd.tx_type=1, sum(sd.tx_vb), 0) as txVb, if(sd.tx_type=0, sum(sd.tx_vb), 0) as outVb, sd.after_vb, sd.create_ti...原创 2019-08-26 15:19:48 · 2471 阅读 · 0 评论 -
mybatis批量更新
引言:经常会遇到的一种业务是进行批量插入或者更新,但是如果使用不当,也会遇到问题。这里有以下几种方法:1. 直接在xml中进行for遍历集合参数:<update id="batchUpdate" parameterType="java.util.List"> <foreach collection="list" separator=";" item="i...原创 2019-08-13 11:13:50 · 237 阅读 · 0 评论 -
日期分组及明细
1. 平常大多数的业务展示明细,基本都是一个纯list结构数据就搞定。但是凡事都有例外。比如像一些交易的记录,需要对日期进行分组。数据格式存在嵌套2. 以下为自己的一种处理方式,没经过效率的对比不知道最优解,仅供参考:<select id="listRecords" resultMap="listRecordsMap"> select t.*, p.payment_i...原创 2019-08-16 11:12:41 · 265 阅读 · 0 评论 -
mybatis遍历foreach中or拼接
1. 关键代码:select id, name from t_keys where 1 = 1<if test="keys != null"><foreach collection="keys" item="key" open="AND (" close=")" separator="or" > name= #{key}</foreach...原创 2019-08-21 10:31:44 · 10476 阅读 · 0 评论 -
varchar字段赋值int查询结果不正确
1. 如果mysql中定义了varchar类型的字段,查询时给varchar赋值为int型,可能会出现多条数据的意想不到的情况;select user_id from t_merchant where status = true and merchant_id = 12. 但如果将值定义为字符型,才会出现自己想要的结果。3. 经过测试,得知数据库的处理方法是:如果查询时varch...原创 2019-08-07 10:54:08 · 833 阅读 · 0 评论 -
mysql插入或更新
1. 数据插入或更新,既可以在java业务层进行,也可以在mysql数据库层处理。2.业务层一般做法是先查询,如果不存在在插入,如果存在则更新,但是查询和插入不是原子性操作,在并发量比较高的时候,可能两个线程都查询某个记录不存在,所以会执行两次插入,然后其中一条必然会因为主键(这里说的主键不是递增主键)冲突而失败。而数据库层mysql中 insert ... on duplicate k...原创 2019-08-08 17:43:09 · 6497 阅读 · 0 评论 -
表关联数据聚合
在一个表中的关键字段,同时是其他多个表的外键时,如果同时查其他多个表的数据聚合时,容易造成数据错误: 同时聚合多个数据,且关联的都用同一个的id, 造成数据不正确!!!! select x.*, x.totalVb-x.channelVb-x.brandpkVb availableVb from(select s.vb totalVb, IFNULL(sum(ch...原创 2019-04-13 17:13:20 · 575 阅读 · 0 评论 -
分组取每组前几条数据
有个需求:列出每个商家的前几个货品,并展示图片 其中:用户表:t_user,商家表:t_merchant,货品表:t_product, 图片表:t_product_file 看似简单的一个需求,但是用其他方式查询效率不高,并且一次性拿出数据,当数据量比较大时,查询很慢。 在此提供一种较好的方式: select m.merchant_id...原创 2019-04-13 17:06:22 · 590 阅读 · 0 评论 -
mysql的uuid()主键重复
mysql使用了navicat客户端,某次执行了如下sqlselect replace(uuid(), '-', '') as id, u.user_id from t_user u;结果发现,生成的uuid重复了,经过排查,发现是navicat的问题,需要将该sql语句做如下调整:select replace(convert(uuid() using utf8mb4),...原创 2019-04-12 17:34:03 · 4022 阅读 · 0 评论 -
mysql 默认排序规则的坑
mysql默认varchar类型是对大小写不敏感(不区分),如果想要mysql区分大小写需要设置排序规则: utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写。 utf8_genera_ci不区分大小写,ci为case insensitive的缩写,即大小写不敏感。 utf8_general_cs区分大小写,cs为case sensitive的缩写,即大小...原创 2019-03-19 19:24:19 · 6743 阅读 · 0 评论