MySQL实现批量更新不同表中的数据
作者:风水月 发布时间:2024-01-24 09:47:28
标签:MySQL,批量更新,数据
批量更新不同表的数据
今天翻到以前写的批量更新表中的数据的存储过程,故在此做一下记录。
当时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;
查看结果
创建表‘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;
查看结果
批量插入记录
INSERT INTO test_user
(name, age, sex)
VALUES
('张三', 18, '男'),
('赵四', 17, '女'),
('刘五', 16, '男'),
('周七', 19, '女');
查看结果
批量修改记录
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);
查看结果
来源:https://blog.csdn.net/fengshuiyue/article/details/44522033
0
投稿
猜你喜欢
- 前言k-means算法是无监督的聚类算法,实现起来较为简单,k-means++可以理解为k-means的增强版,在初始化中心点的方式上比k-
- 最近背着老婆买了一个switch卡带,这货居然给丈母娘讲,害得我被丈母娘说还小了,不买奶粉买游戏,太气人了,我连夜用python写了个《记仇
- 之前在使用Pandas处理csv文件时,发现如果文件名为中文,则会报错:OSError: Initializing from file fa
- 目录前言sql_mode详解最重要的选项全部选项总结前言相信看过上一篇文章《MySQL案例:一个数据丢失 * 》的童鞋,都应该意识到,sql_
- 乱码问题破解压缩包时候会存在中文乱码问题!1:直接使用Everything搜索出要修改的库文件 zipfile.py ,并用notepad+
- 一、特效预览处理前处理后细节放大后二、程序原理将图片所在的 256 的灰度映射到相应的字符上面也就是 RGB 值转成相应的字符然后再将字符其
- Python中的单元测试我们先来回顾一下Python中的单元测试方法。下面是一个 Python的单元测试简单的例子:假如我们开发
- 一、背景介绍3月2日凌晨,OpenAI放出了真正的ChatGPT API,不是背后的GPT-3.5大模型,是ChatGPT的本体模型!Cha
- python数据分析工具pandas中DataFrame和Series作为主要的数据结构.本文主要是介绍如何对DataFrame数据进行操作
- 数据库设计范式目前数据库设计有五种范式 , 一般我们数据库只需要满足前三项即可第一范式 : 确保每列保持原子性什么是原子性? 意思就是不可再
- gzip文件读写的时候需要用到Python的gzip模块。具体使用如下:# -*- coding: utf-8 -*-import gzip
- 什么是索引 拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般
- 线程Threading用于提供线程相关的操作。线程是应用程序中工作的最小单元,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程
- 任务:用python时间简单的统计任务-统计男性和女性分别有多少人。用到的物料:xlrd 它的作用-读取excel表数据代码:import
- 本文实例讲述了Python事务操作实现方法。分享给大家供大家参考,具体如下:#coding=utf-8import sysimport My
- 大家好,我是Peter~本文记录的使用seaborn绘制pairplot图,主要是用来显示两两变量之间的关系(线性或非线性,有无较为明显的相
- 此篇文章整理新手编写代码常见的一些错误,有些错误是粗心的错误,但对于新手而已,会折腾很长时间才搞定,所以在此总结下我遇到的一些问题。希望帮助
- 常有人因为页面的面积问题,想在一个窄小的地方,显示一条条的信息,顺序往上滚动,在经典的BBS里,有一个随机上滚动的JS,好些人用不了,现在蛋
- 很简单的方法,但很实用。用过新浪邮箱的朋友应该会知道此脚本的效果。如果您提交的数据处理时间很长,用这个做为提示很不错的.将下面的代码复制到&
- 看看这个logo,有些像python的小蛇吧 。这次介绍的数据库codernityDB是纯python开发的。先前用了下tinyDB这个本地