Error Code 1503:含唯一索引的表按status分区失败求解决方案
解决MySQL按status分区时的1503错误
表结构说明
- ID列:带auto-increment的primary key,用于维护池范围。
- Serial列:唯一键,分区后仍需保持唯一性。
- status列:枚举类型,取值为
A或U。
问题重现
执行按status分区的语句时报错:
ALTER TABLE product PARTITION BY LIST COLUMNS(status) ( PARTITION used VALUES IN ('U'), PARTITION used VALUES IN ('A') );
Error Code : 1503: A Unique Index must include all columns in the table
问题原因
MySQL分区规则明确要求:所有唯一索引(包括主键和自定义唯一键)必须包含分区列。这是因为分区后数据分散在不同分区中,只有让唯一约束包含分区列,才能保证全表范围内的唯一性,而非仅单个分区内的唯一性。你的Serial是独立的唯一键,未包含分区列status,因此触发该错误。另外原语句中两个分区重名,也是需要修正的小问题。
解决步骤
删除原Serial唯一索引
先通过SHOW CREATE TABLE product;查看Serial对应的唯一索引名称,假设为serial_unique,执行删除:ALTER TABLE product DROP INDEX serial_unique;创建包含Serial和status的复合唯一索引
将分区列status加入唯一索引,确保全表范围内Serial+status的唯一性(若业务要求Serial绝对全局唯一,需考虑后续替代方案):ALTER TABLE product ADD UNIQUE KEY serial_status_unique (Serial, status);执行修正后的分区语句
修改分区名避免重复,执行分区:ALTER TABLE product PARTITION BY LIST COLUMNS(status) ( PARTITION partition_used VALUES IN ('U'), PARTITION partition_active VALUES IN ('A') );
替代方案(若需Serial绝对全局唯一)
如果业务要求Serial必须全局唯一(不依赖status),则按status分区的方案不适用,可选择:
- 改用按
ID的RANGE分区,同时在status上建立普通索引,满足status=A的查询需求; - 调整表设计,将
status纳入主键(如PRIMARY KEY(ID, status)),但需评估业务影响。
内容的提问来源于stack exchange,提问作者Virendra Singh Rathore
相关产品推荐
相关产品推荐

