Mysql “错误”;主键必须包括表中的所有列';“s分割函数”;

Mysql “错误”;主键必须包括表中的所有列';“s分割函数”;,mysql,indexing,partitioning,Mysql,Indexing,Partitioning,将列country_id上的分区索引添加到下表时,我得到了错误: 主键必须包括表分区中的所有列 作用 我试图将列country_id添加到包含then id和country_id的PK中。但随后出现类似的错误消息: 唯一键必须包括表分区中的所有列 作用 然后: ALTER TABLE geo.geo_city PARTITION BY RANGE (country_id) ( PARTITION p0 VALUES LESS THAN (2),

将列country_id上的分区索引添加到下表时,我得到了错误:

主键必须包括表分区中的所有列 作用

我试图将列country_id添加到包含then id和country_id的PK中。但随后出现类似的错误消息:

唯一键必须包括表分区中的所有列 作用

然后:

ALTER TABLE geo.geo_city PARTITION BY RANGE (country_id) (
                PARTITION p0 VALUES LESS THAN (2),
                PARTITION p1 VALUES LESS THAN (10),
                PARTITION p2 VALUES LESS THAN (20),
                PARTITION p3 VALUES LESS THAN (30),
                PARTITION pRemain VALUES LESS THAN MAXVALUE
            )
现在该怎么办?

试试这个定义:

CREATE TABLE `geo_city` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `country_id` smallint(5) unsigned NOT NULL,
  `admin_zone_id` bigint(20) unsigned DEFAULT NULL,
  `name` varchar(128) NOT NULL,
  `lat` double NOT NULL,
  `lng` double NOT NULL,
  `population` int(10) unsigned DEFAULT NULL,
  `timezone_id` smallint(5) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`, country_id),
  UNIQUE KEY `idx_unique_city_per_adminzone` (`admin_zone_id`,`name`, country_id),
  KEY `name` (`name`),
  KEY `idx_lat_lng` (`lat`,`lng`),
  KEY `admin_zone_id` (`admin_zone_id`),
  KEY `population` (`population`),
  KEY `timezone_id` (`timezone_id`)
) ENGINE=InnoDB AUTO_INCREMENT=496831 DEFAULT CHARSET=utf8;

如错误所示,每个唯一的密钥都需要包含
国家/地区id
。注意:我不相信
country\u id
真的是分区的好选择,因为国家的大小差异很大。但是,问题不在于特定分区方案的优点。

您需要将所有分区键添加到所有主键和唯一键中。

分区定义在哪里?刚刚添加,谢谢,您需要将country\u id添加到主键和两个唯一键定义中。您可能会发现按country\u id分区没有任何优势。因为您是按
country\u id
分区的,所以将该列放在这两个键的开头是最不有利的。建议将其移到列表的末尾。另外,
自动增量
要求
id
位于某个索引的开头(它不必是
,甚至不必是
唯一的
)。@RickJames。有没有什么地方可以解释分区键在开始还是结束时更好?这是我开发的一个。如果
WHERE
子句有两个条件,则使用一个条件选择分区,然后使用另一个条件在主键或二级索引中获得集群。这对我的工作至关重要。而且,首先使用分区键,分区并不比使用相同索引的非分区表好多少。
CREATE TABLE `geo_city` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `country_id` smallint(5) unsigned NOT NULL,
  `admin_zone_id` bigint(20) unsigned DEFAULT NULL,
  `name` varchar(128) NOT NULL,
  `lat` double NOT NULL,
  `lng` double NOT NULL,
  `population` int(10) unsigned DEFAULT NULL,
  `timezone_id` smallint(5) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`, country_id),
  UNIQUE KEY `idx_unique_city_per_adminzone` (`admin_zone_id`,`name`, country_id),
  KEY `name` (`name`),
  KEY `idx_lat_lng` (`lat`,`lng`),
  KEY `admin_zone_id` (`admin_zone_id`),
  KEY `population` (`population`),
  KEY `timezone_id` (`timezone_id`)
) ENGINE=InnoDB AUTO_INCREMENT=496831 DEFAULT CHARSET=utf8;