一个MySQL的批量修改表字段(列)类型的自定义存储过程
发布日期:2022-03-03 10:44:14 浏览次数:5 分类:技术文章

本文共 1569 字,大约阅读时间需要 5 分钟。

-- 其作用为批量修改一个表的一种字段(列)类型为另一种,例如把VARCHAR(255)修改成INT(128)的,纯属娱乐,风险自负。
delimiter //
DROP PROCEDURE
IF EXISTS batch_alter_column_type ; CREATE PROCEDURE batch_alter_column_type (
tbl_name VARCHAR (128), -- 表名
from_col_type VARCHAR (32), -- 修改之前的字段类型
to_col_type VARCHAR (32) -- 修改之后的字段类型
)
BEGIN
DECLARE col_name VARCHAR (128); -- 当前字段名
DECLARE i_done INT (1) ; -- 游标结束标记
DECLARE SQL_FOR_ALTER VARCHAR (1024) ;
DECLARE mycursor CURSOR FOR SELECT
COLUMN_NAME
FROM
INFORMATION_SCHEMA. COLUMNS
WHERE
CONVERT (TABLE_NAME USING utf8) COLLATE utf8_bin = CONVERT (tbl_name USING utf8) -- 字符串类型转换
AND CONVERT (data_type USING utf8) COLLATE utf8_bin IN (from_col_type) ; 
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET i_done = 1 ; 
OPEN mycursor ; 
exe_loop : -- 自定义loop名
LOOP
FETCH mycursor INTO col_name ;
IF i_done = 1 THEN
LEAVE exe_loop ;
END
IF ;
SET SQL_FOR_ALTER = CONCAT(
"ALTER TABLE ",
tbl_name,
" MODIFY COLUMN ",
col_name,
" ",
to_col_type
) ; -- 拼接SQL 
SET @SQL = SQL_FOR_ALTER ; 
PREPARE stmt
FROM
@SQL ; EXECUTE stmt ; -- 执行SQL
SET i_done = 0 ; -- 重置标记
END LOOP; 
CLOSE mycursor ;
END//
-- 例子
-- 建表
DROP TABLE
IF EXISTS `tbcountdetail` ; CREATE TABLE `tbcountdetail` (
`id` INT (11) NOT NULL,
`batch` VARCHAR (10) DEFAULT NULL,
`organId` VARCHAR (10) DEFAULT NULL,
`facId` VARCHAR (10) DEFAULT NULL,
`model` VARCHAR (10) DEFAULT NULL,
`serialNo` VARCHAR (10) DEFAULT NULL,
`status` VARCHAR (10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci ; -- 执行
CALL batch_alter_column_type (
'tbcountdetail',
'varchar',
'int(10)'
) ;

转载地址:https://blog.csdn.net/yangjiegang8/article/details/79605436 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:flex布局入门案例(学习笔记20171022001)
下一篇:Java实现一些排序算法和数据结构(练习)

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月02日 06时27分45秒