MySQL批量更新不同表中的数据


Posted in MySQL onMay 11, 2022

批量更新不同表的数据

今天翻到以前写的批量更新表中的数据的存储过程,故在此做一下记录。

当时MySQL中的表名具有如下特征,即根据需求将业务表类型分为了公有、私有和临时三种类型,即不同的业务对应三张表,而所做的是区分出是什么类型(公有、私有、临时)的业务表对数据的固定字段做统一规律的处理。

下面为当时所编写的存储过程

BEGIN
  DECLARE done             INT;
  DECLARE v_table_name     VARCHAR(100);
  DECLARE v_disable        VARCHAR(100);
  DECLARE v_disable_temp   VARCHAR(100); -- 存放最终删除sql 
  DECLARE v_table_pre      VARCHAR(100);
  DECLARE v_table_sub      VARCHAR(200);
  DECLARE v_disable_temp_2 VARCHAR(100);
  -- 查询testkaifa库中以'temp_test_p_'开头的表
  DECLARE cursor_table_gis CURSOR FOR SELECT DISTINCT table_name tableName
                                      FROM
                                        information_schema.columns
                                      WHERE
                                        table_schema = 'testkaifa'
                                        AND table_name LIKE '%temp_test_p_%';
 
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
 
  SELECT @done;
 
  OPEN cursor_table_gis;
 
cursor_loop:
  LOOP
    FETCH cursor_table_gis INTO v_table_name;
    IF done = 1 THEN
      LEAVE cursor_loop;
    END IF;
    -- 连接字符串函数
    SET @v_disable = concat_ws(' ', 'update ', v_table_name, 'set is_valid=false where expire_time>now();');
    SELECT @v_disable;
    PREPARE sqlstr FROM @v_disable;
    EXECUTE sqlstr;
    DEALLOCATE PREPARE sqlstr;
 
    SELECT substring_index(v_table_name, '_', 1)
    INTO
      v_table_pre;
    -- IF v_table_pre = 'temp' THEN
    SELECT reverse(left(reverse(v_table_name), instr(reverse(v_table_name), '_')))
    INTO
      v_table_sub;
    SET @v_disable_temp = concat_ws(' ', 'update ', v_table_name, 'set is_valid=false where (expire_time-now())> (select value_data from ', concat('platform_params_p', v_table_sub), 'where param_key=\'tempDismissInterval\');');
    SELECT @v_disable_temp;
    PREPARE sqlstr2 FROM @v_disable_temp;
    EXECUTE sqlstr2;
    DEALLOCATE PREPARE sqlstr2;
    --  END IF;
 
    SET @v_disable_temp_2 = concat_ws(' ', 'update ', v_table_name, 'set is_valid=false where (test_id in(select test_id from ', concat('temp_test_user_p', v_table_sub), ' where (max(latest_act_time )-now())> (select value_data from ', concat('platform_params_p', v_table_sub), 'where param_key=\'tempDismissInterval\'));');
    SELECT @v_disable_temp_2;
    PREPARE sqlstr2 FROM @v_disable_temp;
    EXECUTE sqlstr2;
    DEALLOCATE PREPARE sqlstr2;
 
  END LOOP cursor_loop;
 
  CLOSE cursor_table_gis;
 
  COMMIT;
-- 
END

本代码涉及到的MySQL的内容为

1.查询表名

SELECT DISTINCT table_name tableName
                                      FROM
                                        information_schema.columns
                                      WHERE
                                        table_schema = 'testkaifa'
                                        AND table_name LIKE '%temp_test_p_%';

2.执行拼接的字符串SQL

PREPARE statement_name FROM sql_text /*定义*/ 
EXECUTE statement_name [USING variable [,variable...]] /*执行预处理语句*/ 
DEALLOCATE PREPARE statement_name /*删除定义*/

例如:

SET @v_disable_temp = concat_ws(' ', 'update ', v_table_name, 'set is_valid=false where (expire_time-now())> (select value_data from ', concat('platform_params_p', v_table_sub), 'where param_key=\'tempDismissInterval\');');
    SELECT @v_disable_temp;
    PREPARE sqlstr2 FROM @v_disable_temp;
    EXECUTE sqlstr2;
    DEALLOCATE PREPARE sqlstr2;

批量更新语句(UPDATE)

使用UPDATE语句实现批量修改

示例

下面创建一个名为‘bhl_tes’的数据库,并创建名为‘test_user’的表,字段分别为‘id’,‘age’,‘name’,’sex‘。

创建数据库‘bhl_tes’

代码

CREATE DATABASE IF NOT EXISTS bhl_test;

MySQL批量更新不同表中的数据

查看结果

MySQL批量更新不同表中的数据

创建表‘test_user’

代码

CREATE TABLE IF NOT EXISTS `test_user`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `name` VARCHAR(255) NOT NULL,
   `age` INT(11) NOT NULL,
   `sex` VARCHAR(16),
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

MySQL批量更新不同表中的数据

查看结果

MySQL批量更新不同表中的数据

批量插入记录

INSERT INTO test_user 
(name, age, sex)
VALUES 
('张三', 18, '男'),
('赵四', 17, '女'),
('刘五', 16, '男'),
('周七', 19, '女');

MySQL批量更新不同表中的数据

查看结果

MySQL批量更新不同表中的数据

批量修改记录

UPDATE test_user SET 
name = CASE id 
WHEN 1 THEN '张三' 
WHEN 2 THEN '李四' 
WHEN 3 THEN '王五' 
WHEN 4 THEN '小六' 
END,
age = CASE id 
WHEN 1 THEN 7 
WHEN 2 THEN 8 
WHEN 3 THEN 9 
WHEN 4 THEN 14 
END,
sex = CASE id 
WHEN 1 THEN '男' 
WHEN 2 THEN '男' 
WHEN 3 THEN '男' 
WHEN 4 THEN '男' 
END
WHERE id IN (1,2,3,4);

MySQL批量更新不同表中的数据

查看结果

MySQL批量更新不同表中的数据

MySQL 相关文章推荐
MySQL 角色(role)功能介绍
Apr 24 MySQL
虚拟机linux端mysql数据库无法远程访问的解决办法
May 26 MySQL
为什么MySQL分页用limit会越来越慢
Jul 25 MySQL
Mysql中where与on的区别及何时使用详析
Aug 04 MySQL
MySQL修炼之联结与集合浅析
Oct 05 MySQL
VS2019连接MySQL数据库的过程及常见问题总结
Nov 27 MySQL
MySQL创建定时任务
Jan 22 MySQL
MySql分区类型及创建分区的方法
Apr 13 MySQL
MySQL 数据库范式化设计理论
Apr 22 MySQL
详解Mysq MVCC多版本的并发控制
Apr 29 MySQL
MySQL 原理与优化之原数据锁的应用
Aug 14 MySQL
MySQL count(*)统计总数问题汇总
Sep 23 MySQL
mysql查找连续出现n次以上的数字
May 11 #MySQL
mysql如何查询连续记录
May 11 #MySQL
mysql 体系结构和存储引擎介绍
MySQL数据库 安全管理
May 06 #MySQL
Mysql 文件配置解析介绍
May 06 #MySQL
MySQL数据库中的锁、解锁以及删除事务
May 06 #MySQL
mysql性能优化以及配置连接参数设置
May 06 #MySQL
You might like
xss防御之php利用httponly防xss攻击
2014/03/21 PHP
PHP简单实现冒泡排序的方法
2016/12/26 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
2018/07/30 PHP
Laravel5.5以下版本中如何自定义日志行为详解
2018/08/01 PHP
php 使用mpdf实现指定字段配置字体样式的方法
2019/07/29 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
借用Google的Javascript API Loader来加速你的网站
2009/01/28 Javascript
JavaScript学习笔记之获取当前目录的实现代码
2010/12/14 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
Javascript计算两个marker之间的距离(Google Map V3)
2013/04/26 Javascript
jQuery中map()方法用法实例
2015/01/06 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
使用AngularJS创建自定义的过滤器的方法
2015/06/18 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
解决jquery中动态新增的元素节点无法触发事件问题的两种方法
2015/10/30 Javascript
javascript实现禁止复制网页内容汇总
2015/12/30 Javascript
Bootstrap开发实战之第一次接触Bootstrap
2016/06/02 Javascript
AngularJS实用基础知识_入门必备篇(推荐)
2017/07/10 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
JS实现DOM删除节点操作示例
2018/04/04 Javascript
js实现图片推拉门效果代码实例
2019/05/18 Javascript
在antd中setFieldsValue和defaultVal的用法
2020/10/29 Javascript
Python中使用中文的方法
2011/02/19 Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
2015/03/06 Python
Python操作Excel之xlsx文件
2017/03/24 Python
python机器学习实战之K均值聚类
2017/12/20 Python
python获取程序执行文件路径的方法(推荐)
2018/04/26 Python
对numpy下的轴交换transpose和swapaxes的示例解读
2019/06/26 Python
pytorch AvgPool2d函数使用详解
2020/01/03 Python
罗马尼亚在线杂货店:Pilulka.ro
2019/09/28 全球购物
教师师德承诺书
2014/03/26 职场文书
法律系毕业生求职信
2014/05/28 职场文书
体现团队精神的口号
2014/06/06 职场文书
2019商业计划书格式、范文
2019/04/24 职场文书