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 中相关的锁
May 25 MySQL
详解MySQL中的主键与事务
May 27 MySQL
MySQL注入基础练习
May 30 MySQL
MySQL query_cache_type 参数与使用详解
Jul 01 MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 MySQL
MySQL连接控制插件介绍
Sep 25 MySQL
MySQL修炼之联结与集合浅析
Oct 05 MySQL
基于MySql验证的vsftpd虚拟用户
Nov 07 MySQL
navicat 连接Ubuntu虚拟机的mysql的操作方法
Apr 02 MySQL
详解MySQL的主键查询为什么这么快
Apr 03 MySQL
MySQL 数据库范式化设计理论
Apr 22 MySQL
Mysql开启外网访问
May 15 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
深入PHP5中的魔术方法详解
2013/06/17 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
PHP+jquery+ajax实现即时聊天功能实例
2014/12/23 PHP
PHP之密码加密的几种方式
2015/07/29 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
PHPStrom 新建FTP项目以及在线操作教程
2016/10/16 PHP
javascript Select标记中options操作方法集合
2008/10/22 Javascript
checkbox 复选框不能为空
2009/07/11 Javascript
常用一些Javascript判断函数
2012/08/14 Javascript
DOM基础教程之事件类型
2015/01/20 Javascript
javascript实现textarea中tab键的缩排处理方法
2015/06/26 Javascript
javascript实现显示和隐藏div方法汇总
2015/08/14 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
JS实现简单的浮动碰撞效果示例
2017/12/28 Javascript
微信小程序Getuserinfo解决方案图解
2018/08/24 Javascript
JavaScript递归函数定义与用法实例分析
2019/01/24 Javascript
详解jQuery设置内容和属性
2019/04/11 jQuery
Javascript数组方法reduce的妙用之处分享
2019/06/10 Javascript
js实现弹窗效果
2020/08/09 Javascript
[01:02:06]LGD vs Mineski Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
联想西班牙官网:Lenovo西班牙
2018/08/28 全球购物
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
美国高端牛仔品牌:Silver Jeans
2019/12/12 全球购物
应届毕业生个人自我评价
2013/09/20 职场文书
《浅水洼里的小鱼》听课反思
2014/02/28 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
敬老月活动总结
2014/08/28 职场文书
中学团支部工作总结
2015/08/13 职场文书
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
2021/08/23 MySQL
nginx常用配置conf的示例代码详解
2022/03/21 Servers
angular4实现带搜索的下拉框
2022/03/25 Javascript
关于windows server 2012 DC 环境 重启后蓝屏代码:0xc00002e2的问题
2022/05/25 Servers