原来的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,从而实现复制的操作。