修改mysql字段长度

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';

        

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值