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

问题描述 投票:0回答:1

像这样的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个回答
0
投票

如果你浏览hash partitioning上的MySQL文档,你会发现某些结构是prohibited for partitioning

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

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

要解决此问题,请尝试仅内联UDF函数背后的逻辑:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.