MySQL 批量修改表和字段

MySQL 的 information_schema 數據庫中包含了大量的元數據,通過這些數據可以方便的獲取表和字段的信息,通過組合這些信息可以生成操作表和字段的 SQL。

本文只是爲了方便自己的記錄。

由於發現系統多個數據庫使用的字符集和排序方式有誤,因此要修改錯誤的這部分表,由於修改表無法直接影響 char, varchar, text 等字符串類型的值,因此這部分字段還需要特殊修改。又因爲數據庫開啓了主從複製,因此生成的 SQL 必須是 use 數據庫 形式,不能使用 數據庫.表名 形式。

修改庫

select concat('ALTER database `', SCHEMA_NAME, '` '
              , 'DEFAULT CHARACTER SET=utf8  default COLLATE=utf8_general_ci;')
from SCHEMATA
where SCHEMA_NAME not in (
'information_schema',
'mysql',
'sys',
'performance_schema'
)
and DEFAULT_COLLATION_NAME != 'utf8_general_ci';

生成的 SQL 示例:

ALTER database `oa_wbs` DEFAULT CHARACTER SET=utf8  default COLLATE=utf8_general_ci;

修改表

SELECT concat('use `', TABLE_SCHEMA, '` ;', 
              'ALTER TABLE `', table_name, '` ',
              'DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci;')
FROM `TABLES` 
-- 排除系統表
where TABLE_SCHEMA not in (
'information_schema',
'mysql',
'sys',
'performance_schema'
)
and 
TABLE_COLLATION != 'utf8_general_ci';

生成的 SQL 示例:

use `test` ;ALTER TABLE `author` DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci;
use `test` ;ALTER TABLE `city` DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci;
use `test` ;ALTER TABLE `country_i` DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci;

修改字段

SELECT concat('use `', TABLE_SCHEMA, '`; ',
              ' ALTER TABLE `', TABLE_NAME, 
              '` MODIFY COLUMN `', COLUMN_NAME, '` ' , 
              DATA_TYPE , 
              -- varchar, char, 其他不需要指定長度
              if(data_type like '%text', ' ', 
                           concat('(', CHARACTER_MAXIMUM_LENGTH, ') ')),
              ' CHARACTER SET utf8 COLLATE utf8_general_ci ', 
              if(IS_NULLABLE = 'YES', 'NULL DEFAULT NULL', 'NOT NULL') ,
              ' COMMENT ''', COLUMN_COMMENT, ''';') sqlstr
FROM `COLUMNS` 
-- 排除系統表
where TABLE_SCHEMA not in (
'information_schema',
'mysql',
'sys',
'performance_schema'
)
-- 排除視圖
and not exists (
    select 1 from tables 
    where tables.table_type = 'VIEW' and tables.table_name = columns.table_name)
-- 所有不是 utf8 的表
and (CHARACTER_SET_NAME != 'utf8' or COLLATION_NAME != 'utf8_general_ci');

生成的 SQL 示例:

use `datasync`;  ALTER TABLE `sync_record_detail` MODIFY COLUMN `RESOURCE_FORM_VALUE` text  CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '資源配置';
use `datasync`;  ALTER TABLE `sync_resource_config` MODIFY COLUMN `FORM_TEMPLATE` text  CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '表單';
use `datasync`;  ALTER TABLE `sync_resource_config` MODIFY COLUMN `FORM_DEFAULT_VALUE` text  CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '表單默認值';
use `files`;  ALTER TABLE `sys_file` MODIFY COLUMN `md5` char(32)  CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'md5';

選取一個格式化:

use `files`;  
ALTER TABLE `sys_file` 
MODIFY COLUMN `md5` char(32)
CHARACTER SET utf8 COLLATE utf8_general_ci 
NULL DEFAULT NULL COMMENT 'md5';
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章