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表的增删改查(基础)
Apr 05 MySQL
MySQL表字段时间设置默认值
May 13 MySQL
解决mysql模糊查询索引失效问题的几种方法
Jun 18 MySQL
MySQL系列之二 多实例配置
Jul 02 MySQL
MySQL数据库10秒内插入百万条数据的实现
Nov 01 MySQL
MYSQL 运算符总结
Nov 11 MySQL
浅谈如何保证Mysql主从一致
Mar 13 MySQL
MySQL 分区表中分区键为什么必须是主键的一部分
Mar 17 MySQL
Mysql使用全文索引(FullText index)的实例代码
Apr 03 MySQL
Mysql 文件配置解析介绍
May 06 MySQL
MySQL添加索引特点及优化问题
Jul 23 MySQL
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
Aug 14 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安全技术之 实现php基本安全
2010/09/04 PHP
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
zf框架db类的分页示例分享
2014/03/14 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
2015/11/09 PHP
关于this和self的使用说明
2010/08/01 Javascript
制作jquery遮罩层效果导航菜单代码分享
2013/12/25 Javascript
关于JavaScript中name的意义冲突示例介绍
2014/05/29 Javascript
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
Javascript刷新窗口方法小结
2015/10/21 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
2016/05/25 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
2017/04/14 Javascript
Vue中使用vux的配置详解
2017/05/05 Javascript
vue component 中引入less文件报错 Module build failed
2019/04/17 Javascript
vue如何自动化打包测试环境和正式环境的dist/test文件
2019/06/06 Javascript
vue+axios实现post文件下载
2019/09/25 Javascript
[01:03]DOTA2新的征程 你的脚印值得踏上
2014/08/13 DOTA
Python 多线程实例详解
2017/03/25 Python
git进行版本控制心得详谈
2017/12/10 Python
Python Threading 线程/互斥锁/死锁/GIL锁
2019/07/21 Python
查看已安装tensorflow版本的方法示例
2020/04/19 Python
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
俄罗斯韩国化妆品网上商店:Cosmasi.ru
2019/10/31 全球购物
eBay荷兰购物网站:eBay.nl
2020/06/26 全球购物
毕业生求职简历中的自我评价
2013/10/18 职场文书
采购部岗位职责
2013/11/24 职场文书
汽车队司机先进事迹材料
2014/02/01 职场文书
2014年迎新年活动方案
2014/02/19 职场文书
工作经历证明书范文
2014/11/02 职场文书
大学军训的体会
2014/11/08 职场文书
欠款纠纷起诉状
2015/05/19 职场文书
赵氏孤儿观后感
2015/06/09 职场文书
现实表现证明材料
2015/06/19 职场文书
公司欠款证明
2015/06/24 职场文书
《文化苦旅》读后感:阅读,让人诗意地栖居在大地上
2019/12/24 职场文书
Windows server 2022创建创建林、域树、子域的步骤
2022/06/25 Servers
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python