我正在尝试创建下表,
CREATE TABLE IF NOT EXISTS `hashes` (
`hash` binary(20) NOT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`category` tinyint(1) unsigned NOT NULL DEFAULT '0',
`indexed` tinyint(1) unsigned NOT NULL DEFAULT '0',
`dcma` tinyint(1) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`hash`),
KEY `category` (`category`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci,
PARTITION BY LIST(`category`)(
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),
);
分区用于列category
,它是tinyint(1)
,每个数字对应一个类别。据我所知,我无法通过枚举进行分区,但我认为这种方法可行吗?
我哪里错了?
修改
错误如下,
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PARTITION BY LIST(`category`)( PARTITION p0 VALUES IN(0), PARTITION ' at line 10
答案 0 :(得分:2)
有两个语法错误。试试这段代码 -
CREATE TABLE IF NOT EXISTS `hashes`(
`hash` BINARY(20) NOT NULL,
`name` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`category` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
`indexed` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
`dcma` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
-- PRIMARY KEY (`hash`),
KEY `category` (`category`)
)
ENGINE = INNODB
DEFAULT CHARSET = utf8
COLLATE = utf8_unicode_ci
PARTITION BY LIST (`category`) (
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)
);
注意,我已经注释掉了主键定义。分区有一些限制,其中之一 - 分区表的分区表达式中使用的所有列必须是表可能具有的每个唯一键的一部分。换句话说,表上的每个唯一键必须使用表分区表达式中的每一列。
此处提供更多信息 - Partitioning Keys, Primary Keys, and Unique Keys。
答案 1 :(得分:0)
如果这是您的代码的精确副本,我认为您有一个额外的逗号。
PARTITION BY LIST(`category`)(
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),
);
删除最后一个逗号