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

MySQL分区类似条件判断:如何按指定值划分表分区?

MySQL表分区实现方案

不使用函数的实现(推荐,MySQL 8.0.16及以上)

直接用LIST分区,匹配指定离散值,同时用DEFAULT子句收纳所有剩余数据,逻辑最贴合需求:

CREATE TABLE mytable (
    id INT,
    column_value INT,
    -- 这里补充你的其他列定义
)
PARTITION BY LIST(column_value) (
    PARTITION p1 VALUES IN (433),
    PARTITION p2 VALUES IN (21),
    PARTITION p3 VALUES DEFAULT
);

如果你的MySQL版本低于8.0.16(不支持VALUES DEFAULT),可以改用RANGE分区实现,同样不需要函数:

CREATE TABLE mytable (
    id INT,
    column_value INT,
    -- 这里补充你的其他列定义
)
PARTITION BY RANGE(column_value) (
    PARTITION p2 VALUES LESS THAN (22), -- 整数21会被分到这里
    PARTITION p1 VALUES LESS THAN (434), -- 整数433会被分到这里
    PARTITION p3 VALUES LESS THAN MAXVALUE -- 所有小于21、大于433的值都在这里
);

注意:这种方式要确保column_value的取值逻辑符合分区范围,比如如果有小于21的整数,会自动进入p3,符合需求。

使用函数的实现

MySQL允许在分区定义中使用确定性函数(相同输入必返回相同结果的函数),比如用CASE函数做值映射:

CREATE TABLE mytable (
    id INT,
    column_value INT,
    -- 这里补充你的其他列定义
)
PARTITION BY LIST(
    CASE column_value
        WHEN 21 THEN 21
        WHEN 433 THEN 433
        ELSE 0 -- 用0统一标识剩余值
    END
) (
    PARTITION p1 VALUES IN (433),
    PARTITION p2 VALUES IN (21),
    PARTITION p3 VALUES IN (0)
);

核心问题解答

  • 不使用函数完全可行:MySQL 8.0.16+的LIST DEFAULT方案是最优解,低版本也可以用RANGE分区替代,都不需要依赖函数。
  • 分区定义中可以使用函数:但必须是确定性函数,像NOW()、RAND()这类非确定性函数不能用,否则MySQL会报错。

内容的提问来源于stack exchange,提问作者Mihai Ciobotaru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:57:23