1、需求:
由于之前设计的数据库主键字段太小无法使用uudi等不重复主键导致项目性能问题因此需要
将数据库所有的表字段长度小于35大于15的字段全部扩容到60,字段类型是varchar
2、获取修改字段的sql
注意:单纯的使用alter t_table MODIFY column column_name varchar(60);会导致字段原先的默认值和备注等信息丢失,这是已经影响到代码的逻辑了,是不能接受的
select concat('alter table `',table_name,
'` MODIFY column `',column_name,
'` varchar(60) CHARACTER SET ',Character_set_name,
' COLLATE ',Collation_name,
if(is_nullable='NO',' NOT NULL ',' NULL ') ,
if(column_default is null ,' ',concat(' DEFAULT \'', column_default,'\'')) ,
' COMMENT \'',COLUMN_comment,'\';') as sqlz
from information_schema.COLUMNS
where 1=1
and table_schema = 'schema数据库名称'
and data_type = 'varchar'
and CHARACTER_maximum_LENGTH<35
and CHARACTER_maximum_LENGTH>15
and table_name in
(select table_name
from information_schema.tables
where table_schema = 'schema数据库名称'
and table_type = 'BASE TABLE');
3、执行
alter table `t_table` MODIFY column `Townid` varchar(60)
CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '镇街';
4、其他:
遇到的问题:由于老版本的数据库在设计的时候时间字段默认值使用了:
'0000-00-00 00:00:00'导致在修改其他字段报错,提示该字段默认值有误
临时解决方案是:
-- 获取当前sql_mode
SELECT @@SESSION.sql_mode;
-- 在执行修改命令的开头先执行修改sql-mode 注意需要去掉 NO_ZERO_IN_DATE,NO_ZERO_DATE
set @@SESSION.sql_mode=
'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';