首页 > 数据库 >mysql 可以重复执行的表结构修改存储过程

mysql 可以重复执行的表结构修改存储过程

时间:2023-06-19 14:34:54浏览次数:51  
标签:存储 重复 stmt1 tableName columnName mysql TABLE SELECT SCHEMA

mysql 可以重复执行的表结构修改存储过程

当多个数据库要执行同一个 sql,但是在其中有一个数据库失败需要重新执行,那么就要保证执行的数据库是可以重复执行的了,下面就是可以重复执行的存储过程,收藏起来


DELIMITER;;
CREATE PROCEDURE `AddColumnIfNotExists` (
	tableName VARCHAR ( 100 ),
	columnName VARCHAR ( 100 ),
	dbType VARCHAR ( 100 )) BEGIN
	DECLARE _tableCount INT;
	DECLARE _columnCount INT;
	
	SET _tableCount = ( SELECT COUNT( 1 ) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ( SELECT SCHEMA ()) AND TABLE_NAME = tableName );
	
	SET _columnCount = ( SELECT COUNT( 1 ) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ( SELECT SCHEMA ()) AND TABLE_NAME = tableName AND COLUMN_NAME = columnName );
	IF _tableCount = 1  AND _columnCount = 0 THEN 
		SET @_sqlText = CONCAT( ' ALTER TABLE `', tableName, '` ADD COLUMN `', columnName, '` ', dbType, ' NULL;' );
		PREPARE stmt1 
		FROM @_sqlText;
		EXECUTE stmt1;
		DEALLOCATE PREPARE stmt1;
	END IF;
END;;

DELIMITER;

DELIMITER;;
CREATE PROCEDURE `CreateIndexIfNotExists` (
	tableName VARCHAR ( 100 ),
	columnName VARCHAR ( 100 )) BEGIN
	DECLARE
		_tableCount INT;
	DECLARE
		_indexCount INT;
	
	SET _tableCount = ( SELECT COUNT( 1 ) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ( SELECT SCHEMA ()) AND TABLE_NAME = tableName );
	
	SET _indexCount = (
		SELECT
			count( 1 ) 
		FROM
			information_schema.statistics 
		WHERE
			TABLE_SCHEMA = (
			SELECT SCHEMA
			()) 
			AND TABLE_NAME = tableName 
		AND INDEX_NAME = concat( 'IX_', columnName ));
	IF
		_tableCount = 1 
		AND _indexCount = 0 THEN
			
			SET @_sqlText = CONCAT( ' CREATE INDEX `IX_', columnName, '` ON `', tableName, '`(`', columnName, '` ASC);' );
		PREPARE stmt1 
		FROM
			@_sqlText;
		EXECUTE stmt1;
		DEALLOCATE PREPARE stmt1;
		
	END IF;
	
END;;

DELIMITER;

DELIMITER;;
CREATE PROCEDURE `CreateIndexIfNotExistsWithColumns` ( IN tableName VARCHAR ( 200 ), IN columnName VARCHAR ( 200 ) ) BEGIN
	DECLARE
		_tableCount INT;
	DECLARE
		_indexCount INT;
	
	SET _tableCount = ( SELECT COUNT( 1 ) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ( SELECT SCHEMA ()) AND TABLE_NAME = tableName );
	
	SET _indexCount = (
		SELECT
			count( 1 ) 
		FROM
			information_schema.statistics 
		WHERE
			TABLE_SCHEMA = (
			SELECT SCHEMA
			()) 
			AND TABLE_NAME = tableName 
		AND INDEX_NAME = concat( 'IX_', columnName ));
	IF
		_tableCount = 1 
		AND _indexCount = 0 THEN
			
			SET @_sqlText = CONCAT( ' CREATE INDEX `IX_', columnName, '` ON `', tableName, '`(', columnName, ');' );
		PREPARE stmt1 
		FROM
			@_sqlText;
		EXECUTE stmt1;
		DEALLOCATE PREPARE stmt1;
		
	END IF;
	
END;;

DELIMITER;

DELIMITER;;
CREATE PROCEDURE `CreateUniqueIndexIfNotExistsWithColumns` (
	IN tableName VARCHAR ( 200 ),
	IN indexName VARCHAR ( 200 ),
	IN columnName VARCHAR ( 200 )) BEGIN
	DECLARE
		_tableCount INT;
	DECLARE
		_indexCount INT;
	
	SET _tableCount = ( SELECT COUNT( 1 ) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ( SELECT SCHEMA ()) AND TABLE_NAME = tableName );
	
	SET _indexCount = (
		SELECT
			COUNT( 1 ) 
		FROM
			information_schema.statistics 
		WHERE
			TABLE_SCHEMA = (
			SELECT SCHEMA
			()) 
			AND TABLE_NAME = tableName 
		AND INDEX_NAME = CONCAT( 'IX_', indexName ));
	IF
		_tableCount = 1 
		AND _indexCount = 0 THEN
			
			SET @_sqlText = CONCAT( ' CREATE UNIQUE INDEX `IX_', indexName, '` ON `', tableName, '`(', columnName, ');' );
		PREPARE stmt1 
		FROM
			@_sqlText;
		EXECUTE stmt1;
		DEALLOCATE PREPARE stmt1;
		
	END IF;
	
END;;

DELIMITER;

DELIMITER;;
CREATE PROCEDURE `DropColumnIfExists` (
	tableName VARCHAR ( 100 ),
	columnName VARCHAR ( 100 )) BEGIN
	DECLARE
		_count INT;
	
	SET _count = ( SELECT COUNT( 1 ) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ( SELECT SCHEMA ()) AND TABLE_NAME = tableName AND COLUMN_NAME = columnName );
	IF
		_count = 1 THEN
			
			SET @_sqlText = CONCAT( ' ALTER TABLE ', tableName, ' DROP COLUMN ', columnName, ' ;' );
		PREPARE stmt1 
		FROM
			@_sqlText;
		EXECUTE stmt1;
		DEALLOCATE PREPARE stmt1;
		
	END IF;
	
END;;

DELIMITER;

DELIMITER;;
CREATE PROCEDURE `DropIndexIfExists` (
	tableName VARCHAR ( 100 ),
	columnName VARCHAR ( 100 )) BEGIN
	DECLARE
		_count INT;
	
	SET _count = (
		SELECT
			count( 1 ) 
		FROM
			information_schema.statistics 
		WHERE
			TABLE_SCHEMA = (
			SELECT SCHEMA
			()) 
			AND TABLE_NAME = tableName 
		AND INDEX_NAME = concat( 'IX_', columnName ));
	IF
		_count > 0 THEN
			
			SET @_sqlText = CONCAT( ' DROP INDEX `IX_', columnName, '` ON `', tableName, '`; ' );
		PREPARE stmt1 
		FROM
			@_sqlText;
		EXECUTE stmt1;
		DEALLOCATE PREPARE stmt1;
		
	END IF;
	
END;;

DELIMITER;

标签:存储,重复,stmt1,tableName,columnName,mysql,TABLE,SELECT,SCHEMA
From: https://www.cnblogs.com/sooooooul/p/17491054.html

相关文章

  • MySQL表类型和存储引擎
    基本介绍MySQL的表类型由存储引擎决定,主要包括MyISAM、innoDB、Memory等MySQL数据表主要支持六种类型,分别是:CSV、Memory、ARCHIVE、MRG_MYISAM、MYISAM、InnoDB这六种又分为两类,一类是“事务安全型”,比如:InnoDB;其余都属于第二类,称为“非事务安全型”细节说明MyISAM不支持事务、也不......
  • MySQL时间函数的选择
    Oracle中获取系统当前的时间,可以用sysdate、systimestamp等函数,在MySQL中,同样有类似的函数可以使用,碰巧看到eygle大神最近的文章,短短几行文字,就介绍了MySQL中获取系统当前时间的来龙去脉。在MySQL中,获得系统当前时间可以使用now()函数,这是最简单和应用最广的函数。除此之外,curre......
  • 初探MySQL-小白的Linux安装笔记
    这篇文章是我们组内一位小伙伴垒的文字,亲测每个步骤,真实、可靠、接地气,照着做就能入门Linux下的MySQL安装,欢迎更多的小伙伴能将日常工作中的经验记录下来,分享给其他人,正所谓“独乐乐不如众乐乐”。最近接到一个任务,由于开发环境变化,需要将旧机器上的mysql迁移到新机器上去,其中涉及......
  • 小白学习MySQL - 闲聊聊
    众所周知,在DB-Engines的排行榜,一直占据前两位的数据库,就是Oracle和MySQL,Oracle作为关系型数据库的老大,在这个生态圈中,占据着绝对优势,MySQL作为一款面向“开源"的软件,虽然被Oracle曲线收购,相比之下,还是存在着“开源”的血统,而且有很多分支,无论是国外的MariaDB,还是国内的AliSQL,都在发......
  • 小白学习MySQL - MySQL会不会受到“高水位”的影响?
    前两天碰到了一个问题,MySQL的一张表,1220万数据量,需要删除1200万数据,仅存储20万数据,讨论了三种方案,1.00:00直接执行truncate,只存储新数据。2.将1220万中的20万采用CTAS存到一张中间表,再通过rename改这两张表的名称,实现替换操作。3.delete删除1200万数据。经过综合考虑,用的方案3,方......
  • php解决 mysql_connect(): The mysql extension is deprecated and will be removed i
    Themysqlextensionisdeprecatedandwillberemovedinthefuture:usemysq翻译:mysql_connect这个模块将在未来弃用,请你使用mysqli或者PDO来替代。解决方法:打开php.ini配置文件把display_errors=On改为display_errors=Off改完之后重启服务就可以了。  ......
  • python之mysql登录验证
    fromdotenvimportload_dotenvimportpymysqlimportosload_dotenv()connection=pymysql.connect(host=os.getenv("HOST"),database=os.getenv("DATABASE"),user=os.getenv("USERNAME"),password=os.getenv("PASSWORD......
  • MySQL中SQL语句的执行顺序(详细)
    一:SQL语句的执行顺序作为一个开发人员,在开发中基本上每时每刻都要和数据库打交到;虽然写过无数的SQL语句,但是写好一个SQL可不是这么简单的,它涉及到各式各样的优化和书写方式;但下面我以MySQL中的SQL执行顺序来作为讲解,对其进行剖析。1:SQL数据的准备为了可以为下文做铺垫,......
  • 介绍一个MySQL参数检索工具
    碰巧看到徐老师的这篇文章《MySQL的参数工具》,其中介绍了一个讲解MySQL不同版本参数的小工具,网站的作者是MySQL日本用户组的负责人Tomita。该网站能够提供不同版本MySQL的参数,包括不同版本之间的对比。当用户需要对MySQL进行升级、需要确认不同版本间的具体参数差异时,就可以用到这......
  • MySQL数据字典提示1146不存在的问题解决
    最近某套MySQL因为磁盘挂载问题,异常宕机,拉起后,数据库能正常访问了,但是在error.log一直提示这个错误,[ERROR]InnoDB:Table`mysql`.`innodb_table_stats`notfound.2021-09-03T08:26:52.446564Z2[ERROR]InnoDB:Fetchofpersistentstatisticsrequestedfortable`jira`.`c......