使用SELECT结合FROM_UNIXTIME、SUBSTRING更新MySQL日期字段的报错解决
报错核心原因
- 触发
Error Code: 1242的本质是等号右侧的子查询未与当前更新行做值关联:逐行执行UPDATE时,无绑定关系的子查询会返回整张表的所有转换结果,单字段赋值仅能接收单值,多行返回直接触发报错。 - 两种报错写法的共性问题:无论是嵌套派生表全表查询、还是无关联条件的裸SELECT,都没有把当前行的
CIS_DATE2值作为计算输入,完全不符合逐行更新的赋值逻辑。
零中间字段的正确实现方案
逐行计算逻辑不需要嵌套子查询,直接将转换函数写入SET子句即可,全程不需要额外建字段存储中间结果:
UPDATE METRIC SET CIS_DATE = FROM_UNIXTIME(SUBSTRING(CIS_DATE2, 1, 10), '%Y-%m-%d') WHERE CIS_DATE2 IS NOT NULL;
结果校验
- 针对测试值
1154390400000000000,通过SUBSTRING(CIS_DATE2,1,10)截取前10位得到时间戳1154390400,经FROM_UNIXTIME格式化后输出2006-08-01,完全匹配指定的映射规则。 - 该写法执行时会逐行读取当前记录的
CIS_DATE2值完成计算赋值,不存在返回多行结果的子查询逻辑,不会触发1242报错。
内容的提问来源于stack exchange,提问作者Kokokoko
相关产品推荐
相关产品推荐

