如题.
有一张表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
;
有一张表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
;
解决方案 »
- MySQL 5.5.9 自动退出
- 有没有大侠能通俗易懂讲解一下MYSQL从安装到界面化操作读取数据之间要经历那些步骤
- java中如何配置使用用postgresql
- 导入sql文件的问题
- Mysql查询结果显示的问题,Thanks!
- mysql 表的设计中state 字段 设计
- MHA配置非root用户等效性问题
- 大神们。出来救救我这个孩子吧!关于sqlite数据库中问题。
- Mysql将数据分组后取出时间最近的数据
- 2013-lost connection to MySQL server at waiting for initial communication packet
- 帮忙看看下面mysql 插入语句 运行不了
- mysql并发问题
UNIQUE INDEX `order_item_id_source` (`order_item_id`, `source`)这些值必须都加入到分区字段中。
请问如果是string 类型的UNIQUE INDEX 可以进行hash分区吗?hash要求整数,如何进行处理呢?cast的函数又不可以用。