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 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端