CREATE DEFINER=`my_db`@`%` PROCEDURE `ChangeTableColumnName`(
in in_table_name varchar(255)
)
BEGIN
	
	
	DECLARE done INT DEFAULT FALSE;
    DECLARE tableName VARCHAR(1000);
    DECLARE columnName VARCHAR(1000);
    DECLARE newColumnName VARCHAR(1000);
		DECLARE newColumnName2 VARCHAR(1000);
    DECLARE columnType VARCHAR(1000);
		DECLARE columnComment VARCHAR(1000);
		
    DECLARE cur CURSOR FOR
        SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE,COLUMN_COMMENT
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_SCHEMA = DATABASE()
						and table_name = in_table_name
				;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;
		

    read_loop: LOOP
        FETCH cur INTO tableName, columnName, columnType,columnComment;
        IF done THEN
            LEAVE read_loop;
        END IF;
				
				set newColumnName = columnName;
				
				#先看首字母要不要改
				IF ASCII(SUBSTRING(columnName,1,1)) BETWEEN 65 AND 90 THEN
					#首字母转小写
					call LowercaseFirstLetter(columnName,newColumnName);
					
							SET @sql = CONCAT('ALTER TABLE `', tableName, '` CHANGE `', columnName, '` `', newColumnName, '` ', columnType);
							if columnComment is not null && columnComment != '' then 
								set @sql = concat(@sql,' COMMENT \'',columnComment,'\'');
							end if;
							-- 执行ALTER TABLE语句
							PREPARE stmt FROM @sql;
							EXECUTE stmt;
							DEALLOCATE PREPARE stmt;

        END IF;
				
				

        -- 再将驼峰命名转换为下划线命名
        call ToLowercaseWithUnderscore(newColumnName,newColumnName2);
				
				#select newColumnName,newColumnName2,newColumnName != newColumnName2;
				
				
        -- 检查是否需要重命名,如果只是这小写不同,还需要识别下阿斯克码
				
        IF (newColumnName != newColumnName2) 
						or ASCII(SUBSTRING(newColumnName,1,1)) != ASCII(SUBSTRING(newColumnName2,1,1)) THEN
				
            SET @sql = CONCAT('ALTER TABLE `', tableName, '` CHANGE `', newColumnName, '` `', newColumnName2, '` ', columnType);
						if columnComment is not null && columnComment != '' then 
							set @sql = concat(@sql,' COMMENT \'',columnComment,'\'');
						end if;
				
						
            -- 执行ALTER TABLE语句
            PREPARE stmt FROM @sql;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;
						
        END IF;
    END LOOP;

    CLOSE cur;
		
		#最后改下表格的字符集
		SET @sql = CONCAT('ALTER TABLE `', tableName, 
		'` CONVERT TO CHARACTER SET  utf8mb4 COLLATE utf8mb4_0900_ai_ci');
		 -- 执行ALTER TABLE语句
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
		

END

Logo

一站式 AI 云服务平台

更多推荐