修改表字段数据类型触发Error Code:1292,报错指向其他字段求解答
问题原因
这是MySQL的sql_mode配置限制加上ALTER TABLE操作的全表校验机制导致的:
- 你的表中
created_at字段存在'0000-00-00 00:00:00'这种无效时间戳值,而当前MySQL的sql_mode包含NO_ZERO_DATE或STRICT_TRANS_TABLES(严格模式),这类规则不允许时间戳字段存储该类无效日期。 - 执行
ALTER TABLE修改单个字段时,MySQL会对整张表的数据做完整性校验,扫描过程中就触发了这个日期值的校验错误。
解决办法
临时绕过(单次操作有效)
先临时调整sql_mode移除无效日期限制,再执行修改:
-- 先查看当前sql_mode,按需调整后续设置 SELECT @@sql_mode; -- 临时设置sql_mode,去掉NO_ZERO_DATE和STRICT_TRANS_TABLES SET sql_mode = 'ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; -- 执行你的字段修改语句 ALTER TABLE mytable CHANGE tournament_id tournament_id BIGINT UNSIGNED NOT NULL;
永久修改配置(长期生效)
如果业务需要长期允许这类日期值,修改MySQL配置文件(Linux为my.cnf,Windows为my.ini):
sql_mode = ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
修改后重启MySQL服务即可生效。
修正数据(推荐)
从根源解决问题,把表中无效日期值替换为合法值:
-- 若字段允许为NULL,可改为NULL UPDATE mytable SET created_at = NULL WHERE created_at = '0000-00-00 00:00:00'; -- 或设置为合法的默认时间,比如Unix纪元起始后一秒 UPDATE mytable SET created_at = '1970-01-01 00:00:01' WHERE created_at = '0000-00-00 00:00:00';
修正完成后再执行ALTER TABLE操作就不会报错了。
内容的提问来源于stack exchange,提问作者MuraliDharan V
相关产品推荐
相关产品推荐

