当前位置: 首页 > article >正文

mysql快速在不同库中执行相同的sql

目录

背景

解决方案

方式一:利用变量拼接好sql,复制出来执行(简单,推荐)

方式二:使用存储过程和游标实现(比较复杂,脚本需要拼接一个完整的,也比较麻烦,不过好处是自动执行的)


背景

最近在做sass,一家客户(企业)对应一个数据库(同一个链接不同的数据库隔离),遇到的问题是通用的功能模块建表,修改数据库字段等等脚本很不方便,之前的执行方式都是将sql脚本手动拼上schema名

如:

alter table test1.example_table add column age varchar(20) COMMENT '年龄';
alter table test2.example_table add column age varchar(20) COMMENT '年龄';

这种方式在租户很少的情况下觉得没什么工作量,但随着客户越来越多,执行脚本起来就越来越麻烦,不胜其烦,所以想利用脚本生成完整的可执行的sql,这样可以省去很多时间。

解决方案

方式一:利用变量拼接好sql,复制出来执行(简单,推荐)

-- 自定义变量是属于会话级别,无需显示删除,会话结束(关闭链接)自动删除,或者SET @my_var = NULL; 删除-- 根据需要修改过滤条件,主要是查找要执行的目标数据库
SET @schemas = (SELECT GROUP_CONCAT(CONCAT('`', SCHEMA_NAME, '`'))FROM INFORMATION_SCHEMA.SCHEMATAWHERE SCHEMA_NAME LIKE 'test%'  
);-- 你要执行的SQL
SET @sql_to_execute = 'CREATE TABLE example_table (id INT PRIMARY KEY, name VARCHAR(100))';  -- sql拼接
SET @combined_sql = (SELECT GROUP_CONCAT(CONCAT('USE ', schema_name, '; ', @sql_to_execute, ';')SEPARATOR ' ') FROM (SELECT SCHEMA_NAME as schema_nameFROM INFORMATION_SCHEMA.SCHEMATAWHERE SCHEMA_NAME LIKE 'test%') t
);-- 查询变量,结果就是可执行的sql,复制出来执行执行
SELECT @combined_sql;-- 例如:上述打印出来的sqlUSE test;
CREATE TABLE example_table (id INT PRIMARY KEY,
NAME VARCHAR ( 100 ));
USE test2;
CREATE TABLE example_table (id INT PRIMARY KEY,
NAME VARCHAR ( 100 ));
USE test3;
CREATE TABLE example_table (id INT PRIMARY KEY,
NAME VARCHAR ( 100 ));
USE test4;
CREATE TABLE example_table (id INT PRIMARY KEY,
NAME VARCHAR ( 100 ));
USE test5;
CREATE TABLE example_table (
id INT PRIMARY KEY,
NAME VARCHAR ( 100 ));-- 直接打开一个控制台执行即可,非常简单

如果执行的不是一条语句,是一个脚本也是适应的,如:

-- 这里面就包含两个sql,每条必须是可以执行的
SET @sql_to_execute = 'alter table example_table add column age varchar(20) COMMENT ''年龄'';
alter table example_table1 add column age varchar(20) COMMENT ''年龄'';

方式二:使用存储过程和游标实现(比较复杂,脚本需要拼接一个完整的,也比较麻烦,不过好处是自动执行的)

-- 1. 更改分隔符,因为存储过程中包含多个语句,需要使用不同的分隔符
DELIMITER $$-- 2. 创建名为 operate_database 的存储过程
CREATE PROCEDURE operate_database()
BEGIN-- 3. 声明变量 done 用于控制循环,默认为 FALSEDECLARE done INT DEFAULT FALSE;-- 4. 声明变量 db_name 用于存储数据库名称DECLARE db_name VARCHAR(100);-- 5. 声明游标,用于遍历所有以 'test' 开头的数据库DECLARE cur CURSOR FOR SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME LIKE 'test%';-- 6. 声明异常处理,当没有更多记录时设置 done 为 TRUEDECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;-- 7. 打开游标OPEN cur;-- 8. 开始循环处理每个数据库read_loop: LOOP-- 9. 从游标中获取下一个数据库名称FETCH cur INTO db_name;-- 10. 如果没有更多数据库,退出循环IF done THENLEAVE read_loop;END IF;-- 11. 构造创建表的 SQL 语句-- 使用反引号(`)包围数据库名和表名,防止特殊字符和保留字的问题SET @sql = CONCAT('CREATE TABLE IF NOT EXISTS `', db_name, '`.`example_table` (id INT PRIMARY KEY,name VARCHAR(100))');-- 12. 预处理 SQL 语句PREPARE stmt FROM @sql;-- 13. 执行预处理的语句EXECUTE stmt;-- 14. 释放预处理的语句DEALLOCATE PREPARE stmt;END LOOP;-- 15. 关闭游标CLOSE cur;
-- 16. 结束存储过程
END $$-- 17. 将分隔符改回分号
DELIMITER ;-- 18. 调用存储过程
CALL operate_database();-- 19. 验证表是否创建成功
-- 查询 INFORMATION_SCHEMA.TABLES 视图,显示所有创建的表
SELECT TABLE_SCHEMA as database_name,  -- 数据库名TABLE_NAME as table_name,       -- 表名'Table exists' as status        -- 状态信息
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA LIKE 'test%'     -- 筛选以 test 开头的数据库AND TABLE_NAME = 'example_table'; -- 筛选表名为 example_table 的表-- 20. 删除存储过程,清理环境
DROP PROCEDURE IF EXISTS operate_database;

关键概念解释:

  1. DELIMITER $$ - 更改分隔符,使存储过程内的分号不会结束整个语句
  2. DECLARE - 用于声明变量和游标
  3. CURSOR - 用于遍历结果集的数据库对象
  4. HANDLER - 异常处理机制
  5. PREPARE, EXECUTE, DEALLOCATE - 动态SQL执行的三个步骤
  6. CONCAT - 字符串拼接函数
  7. INFORMATION_SCHEMA - MySQL的信息数据库,包含数据库和表的元数据

这种方式如果本身有个sql脚本包含多个sql,拼接起来也比较繁琐

相关文章:

mysql快速在不同库中执行相同的sql

目录 背景 解决方案 方式一:利用变量拼接好sql,复制出来执行(简单,推荐) 方式二:使用存储过程和游标实现(比较复杂,脚本需要拼接一个完整的,也比较麻烦,不…...

大模型微调 - transformer架构

什么是Transformer Transformer 架构是由 Vaswani 等人在 2017 年提出的一种深度学习模型架构,首次发表于论文《Attention is All You Need》中 Transformer 的结构 Transformer 编码器(Encoder) 解码器(Decoder) …...

【器件专题1——IGBT第1讲】IGBT:电力电子领域的 “万能开关”,如何撑起新能源时代?

一、IGBT 是什么?重新认识这个 “低调的电力心脏” 你可能没听过 IGBT,但一定用过它驱动的设备:家里的变频空调、路上的电动汽车、屋顶的光伏逆变器,甚至高铁和电网的核心部件里,都藏着这个 “电力电子开关的瑞士军刀”…...

文件IO(Java)

注:此博文为本人学习过程中的笔记 1.概念 狭义上的文件是指保存在硬盘上的文件,广义上指操作系统进行资源管理的一种机制,很多软件/硬件资源都可以抽象成文件,这里我们针对的是狭义上的文件。 在硬盘里还有文件夹,这…...

常见缓存淘汰算法(LRU、LFU、FIFO)的区别与实现

一、前言 缓存淘汰算法主要用于在内存资源有限的情况下,优化缓存空间的使用效率。以确保缓存系统在容量不足时能够智能地选择需要移除的数据。 二、LRU(Least Recently Used) 核心思想:淘汰最久未被访问的数据。实现方式&#x…...

Sentinel数据S2_SR_HARMONIZED连续云掩膜+中位数合成

在GEE中实现时,发现简单的QA60是无法去云的,最近S2地表反射率数据集又进行了更新,原有的属性集也进行了变化,现在的SR数据集名称是“S2_SR_HARMONIZED”。那么: 要想得到研究区无云的图像,可以参考执行以下…...

HTMLCSS模板实现水滴动画效果

.container 类:定义了页面的容器样式。 display: flex:使容器成为弹性容器,方便对其子元素进行布局。justify-content: center 和 align-items: center:分别使子元素在水平和垂直方向上居中对齐。min-height: 100vh:设…...

Cesium实现地形可视域分析

Cesium实现可视化分析 一、地形可视域主要实现技术(Ray + 地形碰撞检测) Cesium 本身的 Ray 类可以用来执行非常精确的射线检测,我们可以结合地形高度(sample)来逐点检测光线是否与 terrain 相交,从而判断是否可见。 1.1 优势 实时判断每条射线是否被 terrain 遮挡地形…...

前端如何获取文件的 Hash 值?多种方式详解、对比与实践指南

文章目录 前言一、Hash 值为何重要?二、Hash 值基础知识2.1 什么是 Hash?2.2 Hash 在前端的应用场景2.3 常见的 Hash 算法(MD5、SHA 系列) 三、前端获取文件 Hash 的常用方式3.1 使用 SparkMD5 计算 MD5 值3.2 使用 Web Crypto AP…...

【数据可视化艺术·应用篇】三维管线分析如何重构城市“生命线“管理?

在智慧城市、能源管理、工业4.0等领域的快速发展中,地下管线、工业管道、电力通信网络等“城市血管”的复杂性呈指数级增长。传统二维管理模式已难以应对跨层级、多维度、动态变化的管线管理需求。三维管线分析技术应运而生,成为破解这一难题的核心工具。…...

蓝桥杯 16.对局匹配

对局匹配 原题目链接 题目描述 小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分,代表他的围棋水平。 小明发现,网站的自动对局系统在匹配对手时,只会将积分差恰好是 K 的两名用户匹配在一起。如果两人分差小…...

【MinerU】:一款将PDF转化为机器可读格式的工具——RAG加强(Docker版本)

目录 创建容器 安装miniconda 安装mineru CPU运行 GPU加速 多卡问题 创建容器 构建Dockerfile文件 开启ssh服务,设置密码为1234等操作 # 使用官方 Ubuntu 24.04 镜像 FROM ubuntu:24.04# 安装基础工具和SSH服务 RUN apt-get update && \apt-get ins…...

DeepSeek回答过于笼统,提示词如何优化

针对DeepSeek回答过于笼统的问题,可通过以下方法优化,使输出更具体、详细: 一、优化提示词设计 明确具体要求 在提问中嵌入「背景限制示例」,例如: “作为跨境电商运营新手,请详细说明如何优化亚马逊产品标…...

C语言实现贪心算法

一、贪心算法核心思想 特征:在每一步选择中都采取当前状态下最优(局部最优)的选择,从而希望导致全局最优解 适用场景:需要满足贪心选择性质和最优子结构性质 二、经典贪心算法示例 1. 活动选择问题 目标&#xff1a…...

全球碳化硅晶片市场深度解析:技术迭代、产业重构与未来赛道争夺战(2025-2031)

一、行业全景:从“材料突破”到“能源革命”的核心引擎 碳化硅(SiC)作为第三代半导体材料的代表,凭借其宽禁带(3.26eV)、高临界击穿场强(3MV/cm)、高热导率(4.9W/cmK&…...

FreeRTOS学习笔记【10】-----任务上下文切换

1 概念性内容 开机到调度需要经历的步骤有: 系统初始化任务创建启动调度器上下文切换时间分片任务执行 1.1 任务本质 FreeRTOS 的 任务(Task)本质上就是一个运行在任务自己的栈区中无限循环的函数 一段上下文(context&#x…...

Appium自动化开发环境搭建

自动化 文章目录 自动化前言 前言 Appium是一款开源工具,用于自动化iOS、Android和Windows桌面平台上的本地、移动web和混合应用程序。原生应用是指那些使用iOS、Android或Windows sdk编写的应用。移动网页应用是通过移动浏览器访问的网页应用(appum支持iOS和Chrom…...

C++学习-入门到精通-【1】C++编程入门,输入/输出和运算符

C学习-入门到精通-【1】C编程入门,输入/输出和运算符 C编程入门,输入/输出和运算符 C学习-入门到精通-【1】C编程入门,输入/输出和运算符第一个C程序:输出一行文本算术运算 第一个C程序:输出一行文本 // 文本打印程序…...

UOJ 228 基础数据结构练习题 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​),有 m m m 个操作分三种: add ⁡ ( l , r , k ) \operatorname{add}(l,r,k) add(l,r,k):对每个 i ∈ [ l , r ] i\in[l,r] i∈[l,r] 执行 …...

面向高性能运动控制的MCU:架构创新、算法优化与应用分析

摘要:现代工业自动化、汽车电子以及商业航天等领域对运动控制MCU的性能要求不断提升。本文以国科安芯的MCU芯片AS32A601为例,从架构创新、算法优化到实际应用案例,全方位展示其在高性能运动控制领域的优势与潜力。该MCU以32位RISC-V指令集为基…...

某地农产品交易中心钢网架自动化监测项目

1. 项目简介 本项目规划建设现代物流产业园,新建6万平方米仓库,具体为新建3栋钢构仓库2万平方米,2栋砖混结构仓库1万平方米,3栋交易中心2万平方米,改造现有3栋3层砖混结构仓库1万平方米,配备智能化仓库物流…...

【无人机】无人机位置估计出现偏差的原因分析

目录 #0、原因分析 #1、过度振动的测定 #2、确定过度陀螺仪偏差 #3、偏航精度差的测定 #4、确定 GPS 精度差 #5、确定 GPS 数据丢失 #6、气压计地面效应补偿 #0、原因分析 位置背离的最常见原因是: 参考:Using the ECL EKF | PX4 Guide (v1.15)…...

element-plus(vue3)表单el-select下拉框的远程分页下拉触底关键字搜索实现

一、基础内核-自定义指令 1.背景 2.定义 3.使用 4.注意 当编辑时需要回显,此时由于分页导致可能匹配不到对应label文本显示,此时可以这样解决 二、升级使用-二次封装组件 三、核心代码 1.自定义指令 定义 ----------------selectLoadMoreDirective.…...

轻松完成视频创作,在线视频编辑器,无需下载软件,功能多样实用!

小白工具的在线视频编辑https://www.xiaobaitool.net/videos/edit/ 功能丰富、操作简便,在线裁剪或编辑视频工具,轻松完成视频创作能满足多种视频编辑需求。 格式支持广泛:可编辑超百种视频格式,基本涵盖常见和小众视频格式&#…...

高精度运算

1.乘法 #include <bits/stdc.h> using namespace std;char s1[2000], s2[2000]; int a[2000], b[2000], c[4000];int main() {cin >> s1 >> s2;int ls1 strlen(s1);int ls2 strlen(s2);int ls3 ls1 ls2;// 将字符串 s1 和 s2 转换为数组 a 和 bfor (int…...

express的模板handlebars用app.engine()创建配置和用exphbs.create()的区别

在使用 express-handlebars 时&#xff0c;app.engine 和 exphbs.create 都可以用来配置 Handlebars 模板引擎&#xff0c;但它们的使用方式和功能有一些区别。以下是详细的对比和说明 app.engine 方法 app.engine 是 Express 提供的方法&#xff0c;用于注册一个新的模板引擎…...

豆瓣图书数据采集与可视化分析(三)- 豆瓣图书数据统计分析

文章目录 前言一、数据读取与保存1. 读取清洗后数据2. 保存数据到CSV文件3. 保存数据到MySQL数据库 二、不同分类统计分析1. 不同分类的图书数量统计分析2. 不同分类的平均评分统计分析3. 不同分类的平均评价人数统计分析4. 不同分类的平均价格统计分析5. 分类综合分析 三、不同…...

聊透多线程编程-线程互斥与同步-13. C# Mutex类实现线程互斥

目录 一、什么是临界区&#xff1f; 二、Mutex类简介 三、Mutex的基本用法 解释&#xff1a; 四、Mutex的工作原理 五、使用示例1-保护共享资源 解释&#xff1a; 六、使用示例2-跨进程同步 示例场景 1. 进程A - 主进程 2. 进程B - 第二个进程 输出结果 ProcessA …...

Sql刷题日志(day5)

面试&#xff1a; 1、从数据分析角度&#xff0c;推荐模块怎么用指标衡量&#xff1f; 推荐模块主要目的是将用户进行转化&#xff0c;所以其主指标是推荐的转化率推荐模块的指标一般都通过埋点去收集用户的行为并完成相应的计算而形成相应的指标数据&#xff0c;而这里的驱动…...

【Test】单例模式❗

文章目录 1. 单例模式2. 单例模式简单示例3. 懒汉模式4. 饿汉模式5. 懒汉式和饿汉式的区别 1. 单例模式 &#x1f427;定义&#xff1a;保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 单例模式是一种常用的软件设计模式&#xff0c;在它的核心结构中只包…...