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 8.0 之不可见列的基本操作
May 20 MySQL
MySQL中出现乱码问题的终极解决宝典
May 26 MySQL
Mysql中存储引擎的区别及比较
Jun 04 MySQL
MySQL连表查询分组去重的实现示例
Jul 01 MySQL
SQL基础的查询语句
Nov 11 MySQL
MySQL中B树索引和B+树索引的区别详解
Mar 03 MySQL
MySQL高级进阶sql语句总结大全
Mar 16 MySQL
mysql 生成连续日期及变量赋值
Mar 20 MySQL
数据分析数据库ClickHouse在大数据领域应用实践
Apr 03 MySQL
详解Mysql事务并发(脏读、不可重复读、幻读)
Apr 29 MySQL
MySQL 数据表操作
May 04 MySQL
MySQL串行化隔离级别(间隙锁实现)
Jun 16 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
php的POSIX 函数以及进程测试的深入分析
2013/06/03 PHP
php除数取整示例
2014/04/24 PHP
thinkphp学习笔记之多表查询
2014/07/28 PHP
php实现映射操作实例详解
2019/10/02 PHP
HTML中Select不用Disabled实现ReadOnly的效果
2008/04/07 Javascript
javascript脚本调试方法小结
2008/11/24 Javascript
js输入框邮箱自动提示功能代码实现
2013/12/10 Javascript
浅析JQuery UI Dialog的样式设置问题
2013/12/18 Javascript
JavaSacript中charCodeAt()方法的使用详解
2015/06/05 Javascript
js轮播图代码分享
2016/07/14 Javascript
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
基于vue.js快速搭建图书管理平台
2017/10/29 Javascript
简单实现jquery隔行变色
2017/11/09 jQuery
浅谈Vue 数据响应式原理
2018/05/07 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
2018/07/17 Javascript
Javascript之高级数组API的使用实例
2019/03/08 Javascript
重学JS 系列:聊聊继承(推荐)
2019/04/11 Javascript
javascript随机变色实例代码
2019/10/15 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
[37:23]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第二局
2016/03/04 DOTA
python实现划词翻译
2020/04/23 Python
Python字符串特性及常用字符串方法的简单笔记
2016/01/04 Python
TensorFlow实现创建分类器
2018/02/06 Python
详解Python安装tesserocr遇到的各种问题及解决办法
2019/03/07 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
保荐人的岗位职责
2013/11/19 职场文书
委托书样本
2014/04/02 职场文书
外语系毕业生求职自荐信
2014/04/12 职场文书
新党章心得体会
2014/09/04 职场文书
信用卡逾期证明示例
2014/09/13 职场文书
教育实践活动对照检查材料
2014/09/23 职场文书
2015年高校图书馆工作总结
2015/04/30 职场文书
python_tkinter弹出对话框创建
2022/03/20 Python
python微信智能AI机器人实现多种支付方式
2022/04/12 Python
winserver2019安装软件一直卡在应用程序正在为首次使用做准备
2022/06/10 Servers