为了账号安全,请及时绑定邮箱和手机立即绑定

MySql的批量插入批量更新以及分组取最大值

标签:
MySQL

1,为了演示,随便创建的两个表,用户表uesr,东区用户表user_east:

     CREATE TABLE USER(
        id INT(10) NOT NULL AUTO_INCREMENT,
        table_id INT(4) NOT NULL,
        NAME VARBINARY(20)  NOT NULL,
        address VARBINARY(20) NOT NULL,
        pv INT(10) DEFAULT 0,
        PRIMARY KEY(id)
        ) DEFAULT CHARSET = utf8;
     CREATE TABLE user_east(
        id INT(10) NOT NULL AUTO_INCREMENT,
        NAME VARBINARY(20) NOT NULL,
        address VARBINARY(20) NOT NULL,
        pv INT(10) DEFAULT 0,
        PRIMARY KEY(id)
        )DEFAULT CHARSET = utf8;

图片描述

2 user表批量插入数据:

   insert into user(table_id,name,address,pv) values
    (1,'张三','东区',44),
    (2,'李四','西区',66),
    (1,'王五','东区',33),
    (2,'吴磊','西区',55),
    (1,'花千骨','东区',55),
    (3,'张小凡','南区',30),
    (3,'白青龙','南区',50);

图片描述

3..按区域找出该区域流量pv最大的记录
group by 默认得到该组出现的第一条记录
图片描述
只要将最大的作为第一条记录即可

SELECT * FROM (SELECT * FROM USER ORDER BY pv DESC) AS u GROUP BY u.table_id;

图片描述
方法很多,我个人认为这种比较简单好理解。
那么如何按照分组取出每组最大的前两项了?(广大朋友们先思考)

4 将user表东区的数据插入用户东区表:
添加user_east表的时候忘记了个字段user_id,这里加上,后面更新的时候要用到

ALTER TABLE user_east ADD COLUMN user_id INT(10) NOT NULL AFTER pv;

图片描述
注意不要加括号。

INSERT INTO user_east(NAME,address,pv,user_id)  SELECT NAME,address,pv,id FROM USER WHERE table_id = 1;

5 批量同步更新user表的pv和对应的user_east的pv字段,都加1.
大家先看一个不是左右链接链接查询的列子:
图片描述
大家可以join left on查询来看,就会有数据了。为空的部分都是null。

UPDATE USER u1,user_east u2 SET u1.pv = u1.pv*10,u2.pv=u1.pv*10 WHERE u2.user_id = u1.id AND u1.table_id = 1;

图片描述
在mysql的官网中,没有找到这样的实列,我在开发的过程中用到了,特别注意的是,set前后根据where过滤后必须是一对一的关系,一对多的更新直接造
成表行级锁锁定,还有就是事务的配置,执行改操作过程并未错误,接下来执行的只是查询语句错误,报错了更新语句事务无法回退的问题。所以用得要慎重。

有错误,请指出来,一起讨论,谢谢。

点击查看更多内容
5人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
6
获赞与收藏
51

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消