mysql实战之 批量update

mysql实战之批量update

现阶段我们的业务量很小,要对admin_user表中的relationship字段进行更新,指定id是409。已知409是公司内的一服务中心,需要把该服务中心放到区代下面, 区代id是3486,相关字段是paren_id(父子级别关系),需要把409已经409旗下所有商家以及客户都转移到3486下面,这个对应字段是relationship ,业务介绍完毕,下面来实战操作:

查看各个id现在的relationship情况

mysql> SELECT  relationship FROM admin_user WHERE parent_id=409;

+-------------------------+

| relationship            |

+-------------------------+

| ,1,30,304,405,409,437,  |

| ,1,30,304,405,409,450,  |

| ,1,30,304,405,409,464,  |

| ,1,30,304,405,409,465,  |

| ,1,30,304,405,409,471,  |

| ,1,30,304,405,409,505,  |

| ,1,30,304,405,409,540,  |

| ,1,30,304,405,409,793,  |

| ,1,30,304,405,409,794,  |

| ,1,30,304,405,409,1801, |

| ,1,30,304,405,409,1802, |

| ,1,30,304,405,409,1949, |

| ,1,30,304,405,409,2015, |

+-------------------------+

13 rows in set (0.02 sec)

mysql> SELECT relationship FROM admin_user WHERE parent_id=3486;

+---------------------+

| relationship        |

+---------------------+

| ,1,30,304,3486,409, |

+---------------------+

1 row in set (0.02 sec)

现在就是要把parent_id=409 的relationship中’,1,30,304,405,409,437,’所有的409换成3486,

笨方法:一条一条的update,但是业务量小,这样可以实现,假如是几万条数据的话这样操作是不可取的,还有手动更改某一个数很难保证正确性。

UPDATE admin_user SET relationship=‘,1,30,304,405,3486,437,‘ WHERE id=437;

UPDATE admin_user SET relationship=‘,1,30,304,405,3486,450,‘ WHERE id=450;

UPDATE admin_user SET relationship=‘,1,30,304,405,3486,464,‘ WHERE id=464;

。。。。。。。。。。。

其实我就是用这样的方法去更新的,后来经过领导指点采取新的方法实现一条语句更新来实现业务,

使用到的是连接函数concat,查看语法

mysql> help concat

Name: ‘CONCAT‘

Description:

Syntax:

CONCAT(str1,str2,...)

Returns the string that results from concatenating the arguments. May

have one or more arguments. If all arguments are nonbinary strings, the

result is a nonbinary string. If the arguments include any binary

strings, the result is a binary string. A numeric argument is converted

to its equivalent nonbinary string form.

CONCAT() returns NULL if any argument is NULL.

URL: http://dev.mysql.com/doc/refman/5.6/en/string-functions.html

Examples:

mysql> SELECT CONCAT(‘My‘, ‘S‘, ‘QL‘);

-> ‘MySQL‘

mysql> SELECT CONCAT(‘My‘, NULL, ‘QL‘);

-> NULL

mysql> SELECT CONCAT(14.3);

-> ‘14.3‘

我需要替换掉最左边之前的字符,都是固定的,先写下查询的sql语句试试,

mysql> SELECT CONCAT(‘,1,30,304,3486,409,‘,RIGHT(relationship,LENGTH(relationship)-LENGTH(‘,1,30,304,405,409,‘))) AS r1,relationship FROM admin_user WHERE relationship LIKE ‘,1,30,304,405,409,%‘;

+--------------------------+-------------------------+

| r1                       | relationship            |

+--------------------------+-------------------------+

| ,1,30,304,3486,409,437,  | ,1,30,304,405,409,437,  |

| ,1,30,304,3486,409,450,  | ,1,30,304,405,409,450,  |

| ,1,30,304,3486,409,464,  | ,1,30,304,405,409,464,  |

| ,1,30,304,3486,409,465,  | ,1,30,304,405,409,465,  |

| ,1,30,304,3486,409,471,  | ,1,30,304,405,409,471,  |

| ,1,30,304,3486,409,505,  | ,1,30,304,405,409,505,  |

| ,1,30,304,3486,409,540,  | ,1,30,304,405,409,540,  |

| ,1,30,304,3486,409,793,  | ,1,30,304,405,409,793,  |

| ,1,30,304,3486,409,794,  | ,1,30,304,405,409,794,  |

| ,1,30,304,3486,409,1801, | ,1,30,304,405,409,1801, |

| ,1,30,304,3486,409,1802, | ,1,30,304,405,409,1802, |

| ,1,30,304,3486,409,1949, | ,1,30,304,405,409,1949, |

| ,1,30,304,3486,409,2015, | ,1,30,304,405,409,2015, |

+--------------------------+-------------------------+

13 rows in set (0.01 sec)

很显然,r1就是我想要的结果,下面可以更改成一个更新语句了,

mysql> update admin_user set relationship=concat(‘,1,30,304,3486,409,‘,RIGHT(relationship,LENGTH(relationship)-LENGTH(‘,1,30,304,405,409,‘))) where relationship LIKE ‘,1,30,304,405,409,%‘;

Query OK, 13 rows affected (0.05 sec)

Rows matched: 13  Changed: 13  Warnings: 0

mysql> select relationship from admin_user where parent_id=409;

+--------------------------+

| relationship             |

+--------------------------+

| ,1,30,304,3486,409,437,  |

| ,1,30,304,3486,409,450,  |

| ,1,30,304,3486,409,464,  |

| ,1,30,304,3486,409,465,  |

| ,1,30,304,3486,409,471,  |

| ,1,30,304,3486,409,505,  |

| ,1,30,304,3486,409,540,  |

| ,1,30,304,3486,409,793,  |

| ,1,30,304,3486,409,794,  |

| ,1,30,304,3486,409,1801, |

| ,1,30,304,3486,409,1802, |

| ,1,30,304,3486,409,1949, |

| ,1,30,304,3486,409,2015, |

+--------------------------+

13 rows in set (0.02 sec)

搞定,期间我尝试过用when case来实现这个业务,跟单个update一样繁琐,就这13条数据也看不出来有多效率,所以还是这个拼接替换好用,菜鸟级水平奉上。

时间: 2024-10-04 21:37:27

mysql实战之 批量update的相关文章

mysql语句:批量更新多条记录的不同值[转]

mysql语句:批量更新多条记录的不同值[转] mysql语句:批量更新多条记录的不同值 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 1 UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value'; 如果更新同一字段为同一个值,mysql也很简单,修改下where即可: 1 UPDATE mytable SET myfield = 'value' WHERE other_field in ('o

centos mysql 实战 第三节课

centos mysql  实战  第三节课 上两节课1. MySQL的安装2. MySQL启动方式 今天第一个: MySQL里的对象 查看当前有那些数据库:show databases; drop database test;truncate table mysql.db; mysql里view当成Table对待了,没有单独的命令能备份视图,只能备份表 information_schema 字典库 performance_schema 性能相关的字典库 MySQL是一个面向存储引擎解决方案的D

mysql 如何提高批量导入的速度

mysql 如何提高批量导入的速度 最近一个项目测试,有几个mysql数据库的表数据记录达到了几十万条,在搭建测试环境 导入 测试数据时,十分慢.在网上搜索了一下,有下面一些方法可以加快mysql数据库导入数据的速度:0. 最快的当然是直接 copy 数据库表的数据文件(版本和平台最好要相同或相似):1. 设置 innodb_flush_log_at_trx_commit = 0 ,相对于 innodb_flush_log_at_trx_commit = 1 可以十分明显的提升导入速度:2. 使

centos mysql 实战 第三节课 MySQL里的对象 mysql体系结构 mysql日志 数据类型

centos mysql  实战  第三节课   MySQL里的对象  mysql体系结构  mysql日志   数据类型 上两节课1. MySQL的安装2. MySQL启动方式 MySQL里的对象 今天第一个: MySQL里的对象 查看当前有那些数据库:show databases; drop database test;truncate table mysql.db; mysql里view当成Table对待了,没有单独的命令能备份视图,只能备份表 information_schema 字典库

MyBatis魔法堂:各数据库的批量Update操作

一.前言   MyBatis的update元素的用法与insert元素基本相同,因此本篇不打算重复了.本篇仅记录批量update操作的sql语句,懂得SQL语句,那么MyBatis部分的操作就简单了. 注意:下列批量更新语句都是作为一个事务整体执行,要不全部成功,要不全部回滚. 二.MSSQL的SQL语句 WITH R AS( SELECT 'John' as name, 18 as age, 42 as id UNION ALL SELECT 'Mary' as name, 20 as age

mybatis批量update操作的写法,及批量update报错的问题解决方法

mybatis的批量update操作写法很简单,如下: public interface YourMapper extends BaseMapper<YourExt> { void updateBatch(@Param("pojos") Collection<YourExt> pojos); } <update id="updateBatch" parameterType="java.util.Collection"

MySQL: ON DUPLICATE KEY UPDATE 用法

使用该语法可在插入记录的时候先判断记录是否存在,如果不存在则插入,否则更新,很方便,无需执行两条SQL 这个语句知识mysql中,而标准sql语句中是没有的. INSERT INTO .. ON DUPLICATE KEY更新多行记录 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE:如果不会导致唯一值列重复的问题,则插入新行.例如,如果列a被定义为UNIQUE,并

MySQL中select * for update锁表的范围

MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料表单给锁住). 举个例子: 假设有个表单products ,里面有id跟name二个栏位,id是主键. 例1: (明确指定主键,并且有此笔资料,row lock) SELECT * FROM products WHERE id='3' F

centos mysql 实战 优化 汇总

centos mysql 实战   优化 汇总 my.cnf 汇总 包括主从 内核参数汇总 命令汇总 备份还原命令 主从命令 调优汇总 f