MySQL 中发生修改字段类型发生Iccorect column ‘xxx‘ from column ‘yyy‘错误解决

本文讲述了如何在将student表中的varchar类型major字段改为int类型时,避免因类型不匹配和非空约束导致的错误。涉及删除非空约束、设置null值、数据转换和正确执行alter table语句的过程。
摘要由CSDN通过智能技术生成

原来的student表:
在这里插入图片描述
可以知道,major是一个varchar类型的,如今我们需要将major修改成为一个int类型,对应的sql语句应该是:

-- 将major字段修改成为int类型,并且不可以为null,默认值为0
alter table student modify column major int not null default 0;

运行的时候却发生了报错:Iccorect column '自动化' for 'major' at row 1,这是为什么呢?
我们仔细想想,没有修改的时候,major是一个varchar类型,每一行中的这个字段的值都是varchar类型,那么我们只是修改这个字段的类型,但是并没有修改它的值,所以就会发生类型不匹配的情况,从而发生报错。所以我们在修改之前,需要通过update语句将这个字段的值变成null,然后再通过alter table语句进行修改字段类型

但是依旧会存在一些细节需要说明的:

  • 因为student中major字段原本含有非空约束,如果直接通过下面的语句,将major变成null,就会发生报错。
-- 将major设置为null
update student set major = null;

所以进行上面语句之前,我们需要通过altet table语句,将major的非空约束删除,然后才可以设置这个字段为null

alter table student modify major varchar(256); -- major原本是varchar类型的,所以这里依旧是一个varchar类型,如果是其他类型,同样会发生Iccorect column xxx for major at row 1的错误.(删除非空约束)

update student set major = null; -- 将这个字段设置成为null

此时的student表就变成了下面的样子:
在这里插入图片描述
major的值变成了null。

  • 此时我们如果需要将major修改成为int not null default 0的时候,同样会发生报错,因为major中字段的值为null,和修改之后的not null矛盾了,从而发生了’Data truncated for column ‘major’ at row 1’,所以我们一开始并不应该是将major设置为null,而应该设置成为一个整数,以便我们直接通过alter table修改major的类型。但是我们一开始已经设置成为了null,所以此时我们需要给major赋值:
update student set major = 0; -- 将major的值设置为一个整形数字

在这里插入图片描述

然后才可以执行alter table语句将其修改成为int not null default 0的类型

alter table student modify major int not null default 0; -- 修改数据类型

在这里插入图片描述

所以修改数据类型的时候,发生了Iccorect column xxx from yyy的时候,可能是因为数据类型转换的问题。
或者如果没有找到问题的所在,那么大可以重新创建一个表,然后将原来的表的数据赋值到新表中,此时需要使用到INSERT INTO new_table(column1,column2,column3,…) SELECT xxx1,xxx2,xxx3,… FROM old_table,从而实现复制的操作。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值