MySQL 表分区问题,无法针对主键添加HASH分区,请教为何

qq1447958547 2016-11-21 04:44:50
如题.
有一张表u_user ,表本来有几千万数据。
现在针对表添加分区:
alter table u_user
PARTITION BY hash(id)
PARTITIONS 5;

出现错误提示:
[SQL]alter table u_user
PARTITION BY hash(id)
PARTITIONS 5;
[Err] 1503 - A UNIQUE INDEX must include all columns in the table's partitioning function。

id为表的主键。下面为表的建表语句。
CREATE TABLE `NewTable` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键' ,
`source` int(11) NOT NULL COMMENT '订单来源,0表示ecm,以后可能有其它的系统,例如直销o2o。订单相关的键值,例如orderId, 必须和source合起来才唯一' ,
`order_item_id` bigint(20) NOT NULL COMMENT '对应ecm的 orderItemId, orderItemId+source唯一' ,
`order_id` bigint(20) NOT NULL COMMENT '对应ecm的 orderId,非唯一' ,
`platform_id` int(11) NULL DEFAULT NULL COMMENT '平台编码' ,
`receiver_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '收货人姓名' ,
`receiver_mobile` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '收货人手机号,根据 receiverMobile+brand, 可得到 uid' ,
`receiver_user_id` bigint(20) NULL DEFAULT NULL COMMENT '收货人 userId。如果没有品牌,则该值为 null' ,
`brand` int(11) NULL DEFAULT NULL COMMENT '商品的品牌,品牌根据 itemId 得出,一般情况下都不为 null' ,
`item_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商品编码' ,
`item_name` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商品名称' ,
`product_model` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '产品型号' ,
`product_type_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '产品类型id' ,
`product_type` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '产品类型。例如波轮,滚筒' ,
`crm_entcode` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '事业部编码。当前有编码,但无对应的名称' ,
`item_cnt` int(11) NOT NULL COMMENT '数量' ,
`item_price` decimal(13,2) NOT NULL COMMENT '单价' ,
`item_amount` decimal(13,2) NOT NULL COMMENT '金额 item_amount=item_cnt*item_price' ,
`delivery_fee` decimal(13,2) NOT NULL COMMENT '运费' ,
`discount_amount` decimal(13,2) NOT NULL COMMENT '优惠金额' ,
`adjust_amount` decimal(13,2) NOT NULL COMMENT '调整金额' ,
`payment_amount` decimal(13,2) NOT NULL COMMENT '应付金额 payment_amount=item_amount+delivery_fee-discount_amount+adjust_amount' ,
`refund_cnt` int(11) NOT NULL COMMENT '退货数量,需要根据退货单计算得出' ,
`actual_cnt` int(11) NOT NULL COMMENT '实际剩余的数量,即 actualCnt=itemCnt-refundCnt; 剩余数量为0的不会出现在我的产品' ,
`refund_amount` decimal(13,2) NOT NULL COMMENT '退货金额' ,
`actual_pay_amount` decimal(13,2) NOT NULL COMMENT '实际支付金额 actualPayAmount=paymentAmount-refundAmount' ,
`status` int(11) NULL DEFAULT NULL COMMENT '复制过来的 status。这个字段只是保留,不用于状态计算。订单只关心是否cancel' ,
`cancel` bit(1) NOT NULL COMMENT 'true表示已取消。这个值根据 status 得出。ccrm只关心订单是否取消' ,
`exchange` bit(1) NOT NULL COMMENT 'true表示是换货单,NOTE 换货单会出现在我的订单,但不会出现在我的产品,不计算退货数量和金额(因为最终没变),也不参与客单价计算。NOTE 问题:如果换货后的收货人和原收货人不是同一个人,则新的收货人看不到该产品' ,
`invoice_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '发票号' ,
`logistics_com_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '物流公司编码' ,
`logistics_no` varchar(2200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '物流单号' ,
`user_hide_time` datetime NULL DEFAULT NULL COMMENT '用户隐藏时间,为 null 表示不隐藏,否则隐藏,即用户认为不是自己的数据' ,
`order_create_time` datetime NULL DEFAULT NULL COMMENT '对应 outerCreateTime,用户在第3方平台下单的时间,即购买时间' ,
`cancel_time` datetime NULL DEFAULT NULL COMMENT '取消时间' ,
`data_update_time` datetime NOT NULL COMMENT '数据更新时间' ,
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
PRIMARY KEY (`id`),
UNIQUE INDEX `order_item_id_source` (`order_item_id`, `source`) USING BTREE ,
INDEX `order_id` (`order_id`) USING BTREE ,
INDEX `receiver_user_id` (`receiver_user_id`) USING BTREE ,
INDEX `receiver_mobile_brand` (`receiver_mobile`, `brand`) USING BTREE
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
COMMENT='订单明细表'
AUTO_INCREMENT=26621196
ROW_FORMAT=COMPACT
;

...全文
490 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq1447958547 2016-11-21
  • 打赏
  • 举报
回复
引用 2 楼 ACMAIN_CHM 的回复:
PRIMARY KEY (`id`), UNIQUE INDEX `order_item_id_source` (`order_item_id`, `source`) 这些值必须都加入到分区字段中。
情况是这样的,我的表里面的有几个唯一索引和一个主键,唯一索引是字符串来的字段,如果要进行分区的话,我想了一个方法是把字符转数值,然后加起来进行hash分区。但是使用HEX和cast的时候显示This partition function is not allowed。对于这种情况有什么好的处理方案建议吗?
qq1447958547 2016-11-21
  • 打赏
  • 举报
回复
引用 2 楼 ACMAIN_CHM 的回复:
PRIMARY KEY (`id`), UNIQUE INDEX `order_item_id_source` (`order_item_id`, `source`) 这些值必须都加入到分区字段中。
请问如果是string 类型的UNIQUE INDEX 可以进行hash分区吗?hash要求整数,如何进行处理呢?cast的函数又不可以用。
qq1447958547 2016-11-21
  • 打赏
  • 举报
回复
这句话不好理解。您意思是,分区键里面必须包含所有的主键以及唯一约束吗?
ACMAIN_CHM 2016-11-21
  • 打赏
  • 举报
回复
PRIMARY KEY (`id`), UNIQUE INDEX `order_item_id_source` (`order_item_id`, `source`) 这些值必须都加入到分区字段中。
致命的西瓜 2016-11-21
  • 打赏
  • 举报
回复
唯一约束有明确的规定:每个唯一约束必须包含在分区表的分区键(包括主键约束)。

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧