执行SQL插入报错Error in executeUpdate: Table has no partition for value如何解决
报错原因与解决方案
判断正误说明
你的判断不正确,该报错和参数被识别为列表无关,本质是分区表匹配失败问题:你操作的messages表是预先设置了分区规则的分区表,插入数据的某字段值没有落在预先定义的任意分区范围内,就会触发该报错,最常见的分区字段是你语句里的RunStart/RunFinish这类时间字段。你的INSERT语法本身没有逻辑错误,不需要调整语句结构。
具体解决步骤
- 第一步:先查询
messages表的分区规则和现有分区覆盖范围,执行命令:
show create table messages;
返回结果中PARTITION BY后标注的就是分区依赖的字段,下方会列出所有已创建的分区对应的取值范围,比如按RunStart按月分区的场景下,你会看到类似PARTITION p202110 VALUES LESS THAN ('2021-11-01')的配置,就能确认是不是缺了你插入的2021年11月对应的分区。
- 第二步:根据查询结果选择对应处理方案:
- 方案1(推荐):新增对应取值范围的分区,匹配你要插入的数据值。以按
RunStart按月分区、缺少2021年11月分区为例,执行语句:
- 方案1(推荐):新增对应取值范围的分区,匹配你要插入的数据值。以按
ALTER TABLE messages ADD PARTITION (PARTITION p202111 VALUES LESS THAN ('2021-12-01'));
注意按照你实际查询到的分区规则调整语句的分区名、取值范围参数。
- 方案2:如果确认分区规则没有业务使用价值,可以将表调整为非分区表,该操作会合并所有现有分区,执行前请确认数据安全。
- 第三步:分区调整完成后,重新执行你原来的INSERT语句即可正常写入。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

