ERROR 1526表示插入数据超出当前分区范围,因MySQL不自动创建分区,需人工预设;ADD PARTITION仅新增分区,不能扩展边界,RANGE须严格递增且MAXVALUE仅限末尾,LIST须值不重复、不遗漏、全覆盖。
ALTER TABLE ADD PARTITION 报错 ERROR 1526:Table has no partition for value
这是最常触发的信号——说明新插入的数据超出了当前所有分区的覆盖范围,而你又没提前加好对应分区。mysql 不会自动创建分区,必须人工预设。add partition 本身不能“扩展”已有分区边界,只能新增一个独立分区;想覆盖更大范围,得看用的是 range 还是 list 分区。
RANGE 分区加新分区:必须严格递增,且 MAXVALUE 只能出现在最后一个分区
比如按时间做 RANGE COLUMNS(created_at),已有分区到 '2024-06-01',下个分区就得从 '2024-06-01' 开始,不能跳、不能重叠、不能倒序:
ALTER TABLE logs ADD PARTITION (
PARTITION p202407 VALUES LESS THAN ('2024-07-01')
);
-
VALUES LESS THAN的值必须大于上一个分区的上限,否则报错 1508(invalid range) - 如果已有分区用了
MAXVALUE,就无法再ADD PARTITION—— 得先REORGANIZE PARTITION拆分它 - 加分区不会锁全表,但会短暂锁住元数据(MDL),高并发写入时可能卡住 DML
LIST 分区加新值:不能重复,也不能遗漏已有值的归属分区
LIST 分区靠显式枚举值归类,ADD PARTITION 只能追加新值列表,不能修改旧分区内容:
ALTER TABLE region_data ADD PARTITION ( PARTITION p_eu VALUES IN (4, 5, 6) );
- 若尝试插入值
4,但所有现有分区都不包含4,就会报 1526 错误 - 新加的
VALUES IN不能和任何已有分区的值集合重叠,否则报错 1517 - 没有“默认分区”,所有可能取值都必须被某个分区覆盖,否则插入直接失败
为什么不能用 ADD PARTITION “扩边界”?本质是设计约束
ADD PARTITION 是原子性操作,只负责注册新分区结构,不移动或重写数据。RANGE 的边界、LIST 的枚举集,在分区定义里是静态快照。想让旧数据“归入”新区间?不行。想把 VALUES IN (1,2) 改成 VALUES IN (1,2,3)?也不行——必须用 REORGANIZE PARTITION 或 EXCHANGE PARTITION 配合临时表。
最容易被忽略的一点:分区字段的类型和表达式必须和建表时完全一致,连时区、字符集隐式转换都可能导致 ADD PARTITION 失败,错误信息却未必提示清楚。










