MySQL使用存储过程迁移用户表数据,过滤用户名相同名称不同的用户

存储过程简介

存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。它是一段预编译的SQL代码,可以被多次调用,不需要每次都重新编写SQL语句,非常适合用于大量重复性操作的场景。

在MSQL中,存储过程是一种重要的数据库对象,可以接受参数、执行特定任务、返回结果等。通过使用存储过程,可以提高数据库的执行效率、减少网络传输量、提高安全性等。

存储过程的特点如下:

  1. 预编译:存储过程在创建时就被预编译,所以执行速度快。
  2. 可重用:存储过程可以被多次调用,无需每次都重新编写SQL语句。
  3. 模块化:存储过程可以封装复杂的业务逻辑和算法,方便维护和管理。
  4. 安全性:存储过程可以提供更高级别的数据安全性,例如可以限制用户对底层数据的访问权限。
  5. 优化性能:存储过程可以减少网络传输量,提高数据库系统的性能。

MySQL使用存储过程迁移用户表数据,过滤用户名相同名称不同的用户

有以下两张用户表,使用存储过程将用户名相同,名称不同的用户合并到一张表(相同的用户名加AC)

最终效果

SQL脚本

sql 复制代码
DROP PROCEDURE IF EXISTS tsblog;
CREATE PROCEDURE tsblog ( ) 
BEGIN
 -- 定义变量
	DECLARE tusername varchar(128);
	DECLARE tname varchar(225);
	DECLARE tsname varchar(225);
	-- 定义外部游标
	DECLARE m_user_copy_cursor CURSOR FOR SELECT username,name FROM `m_user_copy`;
	
	-- 声明条件处理程序 : 当SQL语句执行抛出的状态码为02000时,将关闭游标u_cursor,并退出
	DECLARE EXIT HANDLER FOR SQLSTATE '02000' CLOSE m_user_copy_cursor;
	-- 打开游标
	OPEN m_user_copy_cursor;
	WHILE TRUE DO
		FETCH m_user_copy_cursor INTO tusername,tname;
		-- 判断用户名是否存在
		IF (select count(*) from m_user where username=tusername)>0 THEN
		  -- 判断名称是否存在
			IF (select count(*) from m_user where username=tusername and `name`=tname)<1 THEN
				-- 不存在则插入
				INSERT INTO `m_user`(`username`, `name` ) VALUES ( CONCAT('AC',tusername), tname);
			END IF;
		ELSE
			-- 用户名不存在则直接插入
			INSERT INTO `m_user`(`username`, `name` ) VALUES (tusername, tname);
		END IF;
	END WHILE;
	-- 关闭游标
	CLOSE m_user_copy_cursor;
END;

call tsblog();

另一种写法

sql 复制代码
DROP PROCEDURE IF EXISTS tsblog;
CREATE PROCEDURE tsblog ( ) 
BEGIN
 -- 定义变量
	DECLARE tusername varchar(128);
	DECLARE tname varchar(225);
	-- DECLARE tsname varchar(225);
	-- 定义外部游标
	DECLARE m_user_copy_cursor CURSOR FOR SELECT username,name FROM `m_user_copy`;
	
	-- 声明条件处理程序 : 当SQL语句执行抛出的状态码为02000时,将关闭游标u_cursor,并退出
	DECLARE EXIT HANDLER FOR SQLSTATE '02000' CLOSE m_user_copy_cursor;
	-- 打开游标
	OPEN m_user_copy_cursor;
	WHILE TRUE DO
		FETCH m_user_copy_cursor INTO tusername,tname;
		-- 判断用户名是否存在
		IF (select count(*) from m_user where username=tusername)>0 THEN
		  -- 判断名称是否存在,@符号通常用于声明局部变量或参数
			select name INTO @tsname from m_user where username=tusername;
			IF @tsname!=tname THEN
				-- 不存在则插入
				INSERT INTO `m_user`(`username`, `name` ) VALUES ( CONCAT('AC',tusername), tname);
			END IF;
		ELSE
			-- 用户名不存在则直接插入
			INSERT INTO `m_user`(`username`, `name` ) VALUES (tusername, tname);
		END IF;
	END WHILE;
	-- 关闭游标
	CLOSE m_user_copy_cursor;
END;

call tsblog();
相关推荐
熊文豪5 分钟前
国产化替代浪潮下:金仓时序数据库的破局之路
数据库·时序数据库·金仓数据库
DBA小马哥6 分钟前
时序数据库InfluxDB迁移替换:痛点剖析与解决方案
运维·数据库·时序数据库·dba
早日退休!!!7 分钟前
数据库高并发技术:核心原理与工程实践
数据库
信创天地10 分钟前
信创环境下数据库与中间件监控实战:指标采集、工具应用与告警体系构建
java·运维·数据库·安全·elk·华为·中间件
TDengine (老段)17 分钟前
TDengine ODBC 连接器进阶指南
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
鱼跃鹰飞17 分钟前
面试题:说一下Spring的事务传播特性
java·数据库·spring
菩提小狗23 分钟前
Sqli-Labs Less4:双引号字符型 SQL 注入详解|靶场|网络安全
数据库·sql·web安全
努力进修33 分钟前
国产化替代背景下Oracle与KingbaseES异构迁移技术全解析
数据库·oracle·kingbasees
一码归一码@2 小时前
Mysql进阶之事务原理
数据库·mysql
老邓计算机毕设9 小时前
SSM学生选课系统xvbna(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·学生选课系统·ssm 框架·高校教学管理