MySQL给含数据的lc6_words表添加RANGE分区时遇1503错误求助
解决MySQL添加RANGE分区时的1503错误
这个1503错误其实是MySQL分区机制的一个硬性约束导致的:只要表有主键或唯一键,那么这个键必须包含分区函数里用到的所有列。你的表主键是jp_wkey,但分区用的是jp_fcharascii,两者完全不重叠,所以触发了这个限制。
下面给你两种可行的解决方案,你可以根据自己的业务需求选择:
方案一:修改主键,包含分区列(推荐)
这是最合规的做法,既满足分区要求,又能保留表的完整性约束。因为你的表已经有数据,操作前一定要先备份!
先备份表数据(防患于未然)
CREATE TABLE lc6_words_backup LIKE lc6_words; INSERT INTO lc6_words_backup SELECT * FROM lc6_words;调整主键结构,把
jp_fcharascii加入主键组合ALTER TABLE lc6_words DROP PRIMARY KEY, ADD PRIMARY KEY (jp_wkey, jp_fcharascii);这里用
jp_wkey(自增列)和jp_fcharascii组成复合主键,既保留了原自增列的唯一性,又满足了分区的约束条件。执行分区语句
ALTER TABLE lc6_words PARTITION BY RANGE COLUMNS(jp_fcharascii)( PARTITION pw2486 VALUES LESS THAN (2486), PARTITION pw2487 VALUES LESS THAN (2487), -- 根据你的需求继续添加其他分区,最后一定要加默认分区兜底 PARTITION pw_default VALUES LESS THAN (MAXVALUE) );
方案二:删除主键(仅适合不需要主键的场景)
如果你坚持要保留原分区逻辑且不想修改主键,那只能删除主键,但这会丢失jp_wkey的主键约束,需要谨慎评估业务影响:
删除主键
ALTER TABLE lc6_words DROP PRIMARY KEY;执行分区语句
ALTER TABLE lc6_words PARTITION BY RANGE COLUMNS(jp_fcharascii)( PARTITION pw2486 VALUES LESS THAN (2486), PARTITION pw2487 VALUES LESS THAN (2487), PARTITION pw_default VALUES LESS THAN (MAXVALUE) );
注意:虽然jp_wkey还是自增列,但没有了主键约束,不过你还有jp_word的唯一约束,所以如果业务上不需要依赖主键的话可以考虑这种方式。
最后再强调一遍:操作前务必备份数据,尤其是数据量较大的表,避免操作失误导致数据丢失。
内容的提问来源于stack exchange,提问作者sariDon
相关产品推荐
相关产品推荐

