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

[复制链接]
查看11 | 回复5 | 2021-1-27 07:16:21 | 显示全部楼层 |阅读模式
如题.
有一张表u_user,表本来有几千万数据。
现在针对表添加分区:
altertableu_user
PARTITIONBYhash(id)
PARTITIONS5;
出现错误提示:
[SQL]altertableu_user
PARTITIONBYhash(id)
PARTITIONS5;
[Err]1503-AUNIQUEINDEXmustincludeallcolumnsinthetable'spartitioningfunction。
id为表的主键。下面为表的建表语句。
CREATETABLE`NewTable`(
`id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'主键',
`source`int(11)NOTNULLCOMMENT'订单来源,0表示ecm,以后可能有其它的系统,例如直销o2o。订单相关的键值,例如orderId,必须和source合起来才唯一',
`order_item_id`bigint(20)NOTNULLCOMMENT'对应ecm的orderItemId,orderItemId+source唯一',
`order_id`bigint(20)NOTNULLCOMMENT'对应ecm的orderId,非唯一',
`platform_id`int(11)NULLDEFAULTNULLCOMMENT'平台编码',
`receiver_name`varchar(64)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULTNULLCOMMENT'收货人姓名',
`receiver_mobile`varchar(64)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULTNULLCOMMENT'收货人手机号,根据receiverMobile+brand,可得到uid',
`receiver_user_id`bigint(20)NULLDEFAULTNULLCOMMENT'收货人userId。如果没有品牌,则该值为null',
`brand`int(11)NULLDEFAULTNULLCOMMENT'商品的品牌,品牌根据itemId得出,一般情况下都不为null',
`item_id`varchar(32)CHARACTERSETutf8COLLATEutf8_general_ciNOTNULLCOMMENT'商品编码',
`item_name`varchar(256)CHARACTERSETutf8COLLATEutf8_general_ciNOTNULLCOMMENT'商品名称',
`product_model`varchar(64)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULTNULLCOMMENT'产品型号',
`product_type_id`varchar(64)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULTNULLCOMMENT'产品类型id',
`product_type`varchar(64)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULTNULLCOMMENT'产品类型。例如波轮,滚筒',
`crm_entcode`varchar(64)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULTNULLCOMMENT'事业部编码。当前有编码,但无对应的名称',
`item_cnt`int(11)NOTNULLCOMMENT'数量',
`item_price`decimal(13,2)NOTNULLCOMMENT'单价',
`item_amount`decimal(13,2)NOTNULLCOMMENT'金额item_amount=item_cnt*item_price',
`delivery_fee`decimal(13,2)NOTNULLCOMMENT'运费',
`discount_amount`decimal(13,2)NOTNULLCOMMENT'优惠金额',
`adjust_amount`decimal(13,2)NOTNULLCOMMENT'调整金额',
`payment_amount`decimal(13,2)NOTNULLCOMMENT'应付金额payment_amount=item_amount+delivery_fee-discount_amount+adjust_amount',
`refund_cnt`int(11)NOTNULLCOMMENT'退货数量,需要根据退货单计算得出',
`actual_cnt`int(11)NOTNULLCOMMENT'实际剩余的数量,即actualCnt=itemCnt-refundCnt;剩余数量为0的不会出现在我的产品',
`refund_amount`decimal(13,2)NOTNULLCOMMENT'退货金额',
`actual_pay_amount`decimal(13,2)NOTNULLCOMMENT'实际支付金额actualPayAmount=paymentAmount-refundAmount',
`status`int(11)NULLDEFAULTNULLCOMMENT'复制过来的status。这个字段只是保留,不用于状态计算。订单只关心是否cancel',
`cancel`bit(1)NOTNULLCOMMENT'true表示已取消。这个值根据status得出。ccrm只关心订单是否取消',
`exchange`bit(1)NOTNULLCOMMENT'true表示是换货单,NOTE换货单会出现在我的订单,但不会出现在我的产品,不计算退货数量和金额(因为最终没变),也不参与客单价计算。NOTE问题:如果换货后的收货人和原收货人不是同一个人,则新的收货人看不到该产品',
`invoice_code`varchar(64)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULTNULLCOMMENT'发票号',
`logistics_com_code`varchar(64)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULTNULLCOMMENT'物流公司编码',
`logistics_no`varchar(2200)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULTNULLCOMMENT'物流单号',
`user_hide_time`datetimeNULLDEFAULTNULLCOMMENT'用户隐藏时间,为null表示不隐藏,否则隐藏,即用户认为不是自己的数据',
`order_create_time`datetimeNULLDEFAULTNULLCOMMENT'对应outerCreateTime,用户在第3方平台下单的时间,即购买时间',
`cancel_time`datetimeNULLDEFAULTNULLCOMMENT'取消时间',
`data_update_time`datetimeNOTNULLCOMMENT'数据更新时间',
`create_time`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMP,
`update_time`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMP,
PRIMARYKEY(`id`),
UNIQUEINDEX`order_item_id_source`(`order_item_id`,`source`)USINGBTREE,
INDEX`order_id`(`order_id`)USINGBTREE,
INDEX`receiver_user_id`(`receiver_user_id`)USINGBTREE,
INDEX`receiver_mobile_brand`(`receiver_mobile`,`brand`)USINGBTREE
)
ENGINE=InnoDB
DEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ci
COMMENT='订单明细表'
AUTO_INCREMENT=26621196
ROW_FORMAT=COMPACT
;

分 -->
回复

使用道具 举报

千问 | 2021-1-27 07:16:21 | 显示全部楼层
唯一约束有明确的规定:每个唯一约束必须包含在分区表的分区键(包括主键约束)。
回复

使用道具 举报

千问 | 2021-1-27 07:16:21 | 显示全部楼层
PRIMARYKEY(`id`),
UNIQUEINDEX`order_item_id_source`(`order_item_id`,`source`)
这些值必须都加入到分区字段中。
回复

使用道具 举报

千问 | 2021-1-27 07:16:21 | 显示全部楼层
这句话不好理解。您意思是,分区键里面必须包含所有的主键以及唯一约束吗?
回复

使用道具 举报

千问 | 2021-1-27 07:16:21 | 显示全部楼层
引用2楼ACMAIN_CHM的回复:PRIMARYKEY(`id`),
UNIQUEINDEX`order_item_id_source`(`order_item_id`,`source`)
这些值必须都加入到分区字段中。

请问如果是string类型的UNIQUEINDEX可以进行hash分区吗?hash要求整数,如何进行处理呢?cast的函数又不可以用。
回复

使用道具 举报

千问 | 2021-1-27 07:16:21 | 显示全部楼层
引用2楼ACMAIN_CHM的回复:PRIMARYKEY(`id`),
UNIQUEINDEX`order_item_id_source`(`order_item_id`,`source`)
这些值必须都加入到分区字段中。

情况是这样的,我的表里面的有几个唯一索引和一个主键,唯一索引是字符串来的字段,如果要进行分区的话,我想了一个方法是把字符转数值,然后加起来进行hash分区。但是使用HEX和cast的时候显示Thispartitionfunctionisnotallowed。对于这种情况有什么好的处理方案建议吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行