You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改表字段数据类型触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 09:36:07