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

时间:2019-02-19 07:22:52

标签: mysql hash

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;

它显示:

  

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

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

1 个答案:

答案 0 :(得分:0)

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

  

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

     

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

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

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

即使可以使一个函数起作用,也可能不是那种高性能,而直接表达是一种更好的方法。