大佬们,构建分区键时可以嵌套函数吗, 如: partition by list(MOD(CAST(列名varchar类型 AS SIGNED), 10))

大佬们,构建分区键时可以嵌套函数吗, 如: partition by list(MOD(CAST(列名varchar类型 AS SIGNED), 10)) ,表中有个varchar类型想作为分区键,内容如 “20020200520000001”,想通过转bigint后再进行MOD作为分区键,不知怎么处理了,爆不支持函数

【 使用环境 】测试环境
【 OB or 其他组件 】dbeaver
【 使用版本 】ob: 3.2.3 企业版
【执行sql如下】:
CREATE TABLE t_imcore_chat_0 (
chat_no varchar(32) NOT NULL COMMENT '会话编号 ',
chat_biz_no varchar(128) DEFAULT NULL COMMENT ‘会话业务编号’,
chat_name varchar(64) DEFAULT NULL,
create_uid varchar(64) DEFAULT NULL COMMENT ‘创建人UID’,
chat_type varchar(32) DEFAULT NULL COMMENT ‘会话类型’,
max_id int(11) DEFAULT NULL COMMENT ‘会话当前最大ID’,
message_num int(11) DEFAULT NULL COMMENT ‘消息总数’,
last_chat_time bigint(20) DEFAULT NULL COMMENT ‘会话最后消息时间’,
receiver_num int(11) DEFAULT NULL COMMENT ‘接收人数量’,
msg_curr_seq int(11) DEFAULT NULL COMMENT ‘会话消息当前序号’,
user_curr_seq int(11) DEFAULT NULL COMMENT ‘会话用户当前序号’,
memo varchar(255) DEFAULT NULL,
gmt_created datetime DEFAULT NULL,
gmt_modified datetime DEFAULT NULL,
state int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘状态字段,从右到左,首位标识新用户是否允许读取历史消息’,
PRIMARY KEY (chat_no),
UNIQUE KEY idx_chat_biz_no_unq (chat_biz_no) BLOCK_SIZE 16384 GLOBAL,
KEY idx_gmt_last_chat (last_chat_time) BLOCK_SIZE 16384 LOCAL
) DEFAULT CHARSET = utf8mb4 TABLEGROUP = ‘tb_chat_no’
partition by list(MOD(CAST(chat_no AS SIGNED), 10))
(partition P0 values in (0),
partition P1 values in (1),
partition P2 values in (2),
partition P3 values in (3),
partition P4 values in (4),
partition P5 values in (5),
partition P6 values in (6),
partition P7 values in (7),
partition P8 values in (8),
partition P9 values in (9));

【报错内容】:SQL 错误 [1564] [HY000]: This partition function is not allowed

分区键必须是列名

直接 MOD(chat_no , 10)是可以的,看了下是直接转二进制进行MOD了,然后加CAST就不可以了

分区键使用cast表达式应该是不支持的。
你可以考虑增加一个生成列,类似 cxx int generated always as (cast (chat_no as SIGNED)),然后用生成列作为分区键

1 个赞