You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 00:20:39