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

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;

作者:Soul

出处:https://www.cnblogs.com/sooooooul/p/17491054.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   CK..Soul  阅读(115)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示