首页 > 解决方案 > 在按 LIST COLUMNS 进行表分区的情况下出现错误

问题描述

我有一个具有以下结构的表:

CREATE TABLE `orders_partition` (
  `Order_Id` bigint(20) NOT NULL,
  `Category_Id` bigint(20) NOT NULL,
  `Order_No` varchar(50) CHARACTER SET latin1 NOT NULL,
  `Student_Id` bigint(20) DEFAULT NULL,
  `Country_Id` bigint(20) NOT NULL,
  `Total_Refers` int(11) NOT NULL,
  `Pages` float(5,1) NOT NULL,
  `Word_count` int(11) NOT NULL,
  `Order_Type_Id` bigint(20) DEFAULT NULL,
  `Reference_Style_Id` int(11) NOT NULL,
  `Payment_Mode_Id` bigint(20) DEFAULT NULL,
  `Payment_Status_Id` bigint(20) DEFAULT NULL,
  `Order_IP` varchar(255) CHARACTER SET latin1 NOT NULL,
  `Order_Amount` decimal(10,2) NOT NULL DEFAULT '0.00',
  `Order_Status_Id` bigint(20) DEFAULT NULL,
  `Panic` tinyint(1) NOT NULL DEFAULT '0',
  `Url_Referal_Detail` text CHARACTER SET latin1 NOT NULL,
  `publish_status` int(11) NOT NULL,
  `L_Q_Reason_Id` varchar(255) CHARACTER SET latin1 DEFAULT 'NULL',
  `Transfer_Status` enum('NT','T','A') CHARACTER SET latin1 NOT NULL DEFAULT 'A' COMMENT 'NT=>not transfer,T=>transfer,A=>allowed to transfer',
  `Visibility` enum('E','D') CHARACTER SET latin1 NOT NULL DEFAULT 'E' COMMENT 'E=enabled, D=disabled',
  `Active_Date` datetime NOT NULL,
  `Active_Status` enum('A','DA') CHARACTER SET latin1 NOT NULL DEFAULT 'A' COMMENT 'A=>Active,DA=>Deactive'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `orders_partition`
  ADD PRIMARY KEY (`Order_Id`),
  ADD UNIQUE KEY `Order_Id` (`Order_Id`),
  ADD KEY `Order_Status_Id` (`Order_Status_Id`),
  ADD KEY `Country_Id` (`Country_Id`)

执行以下分区查询

ALTER TABLE orders_partition
PARTITION BY LIST COLUMNS (Active_Status)
(
   PARTITION p01 VALUES IN ('A'),
PARTITION p02 VALUES IN ('DA')
 )

低于错误

1659 - 字段 'Active_Status' 是此类分区不允许的类型

我想在我们的 mysql 表中实现分区(LIST COLUMNS),mysql 版本是 5.7

标签: mysqldatabase-partitioning

解决方案


不要试图在一个标志上进行分区;它不太可能带来任何好处。

MySQLPARTITIONing有很多限制。您遇到了可以对哪些数据类型进行分区的限制 - 该列表不包括ENUM

如果您已经通过了,下一个错误将是需要在每个唯一键(包括主键)中包含“分区键”。

同时,UNIQUE(Order_id)与 是多余的PRIMARY KEY(Order_id)。PK 是(根据 MySQL 的定义)一个键并且是唯一的。


推荐阅读