MySQL按月份RANGE分区2年数据时遇错误,求排查解决
问题分析与解决
错误原因
你触发的错误核心有两个:
- 分区函数误用常量而非字段:你写的
extract(year_month from 'tnDate')里,'tnDate'是带单引号的字符串常量,不是表中的字段名。MySQL会把它当成固定值处理,属于“常量表达式”,不符合分区函数必须依赖表字段的规则,因此报错。 - 语法小错误:原SQL中
UNIQUE KEY checksum (checksum, tnDate),这一行末尾多了个逗号,会导致语法解析失败。
另外,你的分区边界设置存在逻辑问题:比如PARTITION P23 VALUES LESS THAN (202212)只能包含小于2022年12月的数据(也就是2022年11月及之前),2022年12月的数据会直接落到P24,这不符合你“24个分区对应2021、2022年各月份”的需求。
修正后的建表语句
CREATE TABLE TnTest ( id bigint NOT NULL AUTO_INCREMENT, tnDate date NOT NULL, tnDateTime datetime NOT NULL, tnType varchar(40) NOT NULL, checksum varchar(255) NOT NULL, PRIMARY KEY (id, tnDate), UNIQUE KEY checksum (checksum, tnDate) -- 去掉了末尾多余的逗号 )ENGINE=InnoDB AUTO_INCREMENT=50015 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci PARTITION BY RANGE (extract(year_month from tnDate)) -- 去掉tnDate的单引号 ( -- 历史数据分区(小于2021年1月) PARTITION P_HISTORY VALUES LESS THAN (202101), -- 2021年12个月份分区 PARTITION P_202101 VALUES LESS THAN (202102), PARTITION P_202102 VALUES LESS THAN (202103), PARTITION P_202103 VALUES LESS THAN (202104), PARTITION P_202104 VALUES LESS THAN (202105), PARTITION P_202105 VALUES LESS THAN (202106), PARTITION P_202106 VALUES LESS THAN (202107), PARTITION P_202107 VALUES LESS THAN (202108), PARTITION P_202108 VALUES LESS THAN (202109), PARTITION P_202109 VALUES LESS THAN (202110), PARTITION P_202110 VALUES LESS THAN (202111), PARTITION P_202111 VALUES LESS THAN (202112), PARTITION P_202112 VALUES LESS THAN (202201), -- 2022年12个月份分区 PARTITION P_202201 VALUES LESS THAN (202202), PARTITION P_202202 VALUES LESS THAN (202203), PARTITION P_202203 VALUES LESS THAN (202204), PARTITION P_202204 VALUES LESS THAN (202205), PARTITION P_202205 VALUES LESS THAN (202206), PARTITION P_202206 VALUES LESS THAN (202207), PARTITION P_202207 VALUES LESS THAN (202208), PARTITION P_202208 VALUES LESS THAN (202209), PARTITION P_202209 VALUES LESS THAN (202210), PARTITION P_202210 VALUES LESS THAN (202211), PARTITION P_202211 VALUES LESS THAN (202212), PARTITION P_202212 VALUES LESS THAN (202301), -- 未来数据分区 PARTITION P_FUTURE VALUES LESS THAN MAXVALUE );
关键说明
- 去掉了
tnDate的单引号,让分区函数正确引用表字段,避免常量表达式错误。 - 调整了分区边界:每个月份分区的
LESS THAN值设为下一个月的年月编码,确保该分区只包含对应月份的数据(比如P_202212 VALUES LESS THAN (202301)会包含所有2022年12月的tnDate数据)。 - 给分区起了更直观的名字(比如
P_202101),方便后续维护。 - 删掉了UNIQUE KEY行末尾多余的逗号,修复语法错误。
内容的提问来源于stack exchange,提问作者darlisa
相关产品推荐
相关产品推荐

