DROP PROCEDURE if EXISTS rename_fk_col_comment;
DELIMITER //
CREATE PROCEDURE `rename_fk_col_comment`(
IN `prefix_tbl_name` VARCHAR(255)
)
BEGIN
DECLARE tb_name VARCHAR (200) ;
DECLARE cons_name VARCHAR (200) ;
DECLARE col_name VARCHAR (200) ;
DECLARE ref_tbl_name VARCHAR (200) ;
DECLARE ref_col VARCHAR (200) ;
DECLARE rf_table_comment VARCHAR(1024);
-- 表名后缀,去除tbl_bat_之后的内容
DECLARE suffix_tbl_name VARCHAR(200);
DECLARE no_more_record INT DEFAULT 0 ;
-- 查询每个表下的约束。(外键和唯一键)
DECLARE cons CURSOR FOR
SELECT
t.TABLE_NAME,
t.CONSTRAINT_NAME,
k.COLUMN_NAME,
k.REFERENCED_TABLE_NAME,
k.REFERENCED_COLUMN_NAME,
(SELECT tt.table_comment FROM INFORMATION_SCHEMA.tables tt WHERE tt.TABLE_NAME=k.REFERENCED_TABLE_NAME and tt.TABLE_SCHEMA=DATABASE()) AS rf_table_comment
FROM
information_schema.TABLE_CONSTRAINTS t
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE k
ON t.CONSTRAINT_NAME = k.CONSTRAINT_NAME
AND t.TABLE_NAME = k.TABLE_NAME
AND t.CONSTRAINT_SCHEMA=k.CONSTRAINT_SCHEMA
WHERE t.CONSTRAINT_TYPE='FOREIGN KEY' AND t.table_schema = DATABASE() ;
-- 游标游到底,找不到的时候标志位。注:如果select into var时候,如果找不到,游标的while循环也结束了,no_more_record =1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_record = 1 ;
-- 如果前缀为空,默认使用tbl_作为前缀。
if(prefix_tbl_name IS NULL OR prefix_tbl_name='' OR prefix_tbl_name=' ') then
SET @prefix_tbl_name='tbl_';
ELSE
SET @prefix_tbl_name=prefix_tbl_name;
END if;
-- 禁用外键
SET FOREIGN_KEY_CHECKS=0;
-- 开游标
OPEN cons;
-- 第一个要预先取得,之后在循环里面取
FETCH cons INTO tb_name,cons_name,col_name,ref_tbl_name,ref_col,rf_table_comment;
WHILE no_more_record !=1 DO
-- 截取表名后半部分。去除tbl_bat_字样
SET suffix_tbl_name =REPLACE(tb_name,@prefix_tbl_name,'');
-- 拼接alter 语句
-- alter table `tbl_order_work` change `id` `id` bigint(20) unsigned NOT NULL auto_increment comment '标识,物理主键' ;
SELECT
CONCAT_WS(
'',
'alter table `',
t1.TABLE_NAME,'` change ',
'`', COLUMN_NAME,'` ',
'`', COLUMN_NAME,'` ', -- 新字段名
COLUMN_TYPE,
' ',
IF(
IS_NULLABLE = 'NO',
'NOT NULL',
'NULL'
),
' ',
extra,
' ',
IF(
COLUMN_DEFAULT = NULL,
'',
CONCAT('default ', COLUMN_DEFAULT)
),
" comment '",
-- 可以重复执行,保留原有注释内容
CONCAT_WS('',SUBSTRING_INDEX(COLUMN_COMMENT, ' [外键]', 1), CONCAT_WS('',' [外键]',': 来自 ',ref_tbl_name,'(',rf_table_comment,')','表(',ref_col,')字段')), -- 新注释COLUMN_COMMENT
"' ;"
) INTO @alter_sql
FROM
information_schema.COLUMNS t1
WHERE t1.table_schema = DATABASE()
AND t1.TABLE_NAME = tb_name AND t1.COLUMN_NAME=col_name;
-- 替换某个字符串之后所有内容
-- SELECT CONCAT(SUBSTRING_INDEX('Hello World', ' ', 1), ' Universe') ==> Hello Universe
-- 动态执行拼接出来的sql
PREPARE stmt FROM @alter_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 游标继续向下走,类似于i=i+1
FETCH cons INTO tb_name,cons_name,col_name,ref_tbl_name,ref_col,rf_table_comment;
END WHILE;
-- 开启外键
SET FOREIGN_KEY_CHECKS=1;
END//
DELIMITER ;