【问题标题】:Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed(子)分区函数中不允许使用常量、随机或时区相关的表达式
【发布时间】:2019-07-12 15:09:21
【问题描述】:

mytable 像这样:

CREATE TABLE `test1` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `project_id` int(11) NOT NULL,
    `md5` varchar(255) NOT NULL,
    `create_time` datetime NOT NULL,
    `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`,`project_id`,`md5`),
    KEY `index_id` (`md5`),
) ;

我想通过md5project_id进行分区。 所以我创建了一个函数:

CREATE FUNCTION f2(md5 VARCHAR(255), project_id int(11))
RETURNS int
return MOD(md5, 10) + project_id;

当我对这个表进行分区时,使用这个 sql:

ALTER TABLE test1 PARTITION BY HASH(f2(md5, project_id)) PARTITIONS 100;

它显示:

(子)分区函数中不允许使用常量、随机或时区相关的表达式。

但答案不是恒定的、随机的和时区相关的。所以我不知道如何处理id,谁能帮助我?非常感谢。

【问题讨论】:

    标签: mysql hash


    【解决方案1】:

    如果您浏览hash partitioning 上的 MySQL 文档,您会看到某些构造是 prohibited for partitioning

    禁止的结构。分区表达式中不允许使用以下构造:

    存储过程、存储函数UDF或插件。
    声明的变量或用户变量。

    对于解决方法,尝试仅内联 UDF 函数背后的逻辑:

    ALTER TABLE test1 PARTITION BY HASH(MOD(md5, 10) + project_id) PARTITIONS 100;
    

    即使一个函数可以工作,它也可能不会那么高效,直接表达是一种更好的方法。

    【讨论】:

    • 感谢您的回答,但我早早地尝试了您的sql,它失败了:ERROR 1491 (HY000):PARTITION 函数返回错误的类型
    猜你喜欢
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 2014-04-09
    • 2020-03-05
    • 1970-01-01
    • 2011-08-27
    相关资源
    最近更新 更多