修改列为NOT NULL时触发#1265数据截断错误,附schools表结构
搞定MySQL错误#1265:修改列为NOT NULL时第2行数据截断
嗨,这个错误我熟,本质就是你要设置为NOT NULL的列,在表的第2行里存在不符合要求的数据——要么是单元格本身是NULL,要么是存的数据长度超过了列的定义(结合你改NOT NULL的操作,更大概率是有NULL或者空字符串这类“无效”值)。
先看看你贴的表结构(虽然ownership列的定义被截断了,但能看到大部分列已经标记为NOT NULL了):
CREATE TABLE `schools` ( `id` int(11) NOT NULL, `name` varchar(255) CHARACTER SET utf8 NOT NULL, `describtion` text CHARACTER SET utf8 NOT NULL, `keywords` varchar(255) NOT NULL, `url` varchar(255) NOT NULL, `status` varchar(255) CHARACTER SET utf8 NOT NULL, `location` varchar(255) CHARACTER SET utf8 NOT NULL, `school_type` varchar(255) CHARACTER SET utf8 NOT NULL, `fees` varchar(255) CHARACTER SET utf8 NOT NULL, `ownership` varchar(2...
给你一步步解决的办法:
1. 先揪出问题数据
先定位第2行里你要修改的列到底有啥问题,执行这条SQL(假设你要改的是ownership,如果是其他列替换成对应列名就行):
-- 直接取第2行数据看全貌 SELECT * FROM schools LIMIT 1,1; -- 或者如果id是主键的话,用id定位更准 SELECT `ownership` FROM schools WHERE id = 2;
重点看这个列的值:
- 是不是
NULL? - 是不是空字符串(
'')? - 字符长度是不是超过了列的定义(比如列是
varchar(255),但存了300个字符)?
2. 修复问题数据
根据查到的问题,先把第2行的对应数据修好:
- 如果是
NULL或者空字符串,给它设个符合业务逻辑的默认值,比如:
UPDATE schools SET `ownership` = '公立' WHERE id = 2; -- 这里的'公立'换成你实际需要的默认值
- 如果是数据长度超限,要么截断数据,要么改列的长度:
-- 截断到列允许的长度(比如255) UPDATE schools SET `ownership` = SUBSTRING(`ownership`, 1, 255) WHERE id = 2; -- 或者如果业务允许,直接把列改长 ALTER TABLE schools MODIFY COLUMN `ownership` varchar(500) CHARACTER SET utf8;
3. 再执行修改NOT NULL的操作
等数据修好了,再跑你原本的ALTER语句,比如:
ALTER TABLE schools MODIFY COLUMN `ownership` varchar(255) CHARACTER SET utf8 NOT NULL;
额外提醒
别只盯着第2行,最好全局检查下有没有其他行也有类似问题,避免改完又报错:
-- 检查列里有没有NULL值 SELECT COUNT(*) FROM schools WHERE `ownership` IS NULL; -- 检查有没有空字符串 SELECT COUNT(*) FROM schools WHERE `ownership` = ''; -- 检查有没有长度超限的行 SELECT * FROM schools WHERE CHAR_LENGTH(`ownership`) > 255;
批量把这些问题数据都处理完,再执行修改操作就稳了。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

