[项目踩坑] MySQL 分区:分区键和唯一索引主键的关系,解决报错 A PRIMARY KEY

场景

【项目踩坑】Mysql分区:分区键和唯一索引主键的关系,解决报错 A PRIMARY KEY must include all columns in the table’s partitioning

今天在建立mysql 分区表,设置主键与索引时候报错

错误:

ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table’s partitioning

ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table’s partitioning function

结论

主键必须包括表的分区函数中的所有列,一个惟一的索引必须包括表的分区函数中的所有列,是不是不太好理解意思?分区的key必须是 主键!

那就来看看分析

分析1

其实就是这么个意思:表上的每一个唯一性索引必须用于分区表的表达式上(其中包括主键索引)

下面我来举几个例子:

SQL

CREATE TABLE t1 (  
     id INT NOT NULL,  
     aid DATE NOT NULL,  
     bid INT NOT NULL,   
     PRIMARY KEY (id)  
)  
PARTITION BY KEY(bid)  
PARTITIONS 10;

[Err] 1503 - A PRIMARY KEY must include all columns in the table’s partitioning function

SQL

CREATE TABLE t1 (  
     id INT NOT NULL,  
     aid DATE NOT NULL,  
     bid INT NOT NULL,    
     UNIQUE KEY (id)  
)  
PARTITION BY KEY(bid)  
PARTITIONS 10;

[Err] 1503 - A PRIMARY KEY must include all columns in the table’s partitioning function

SQL

CREATE TABLE t1 (  
     id INT NOT NULL,  
     aid DATE NOT NULL,  
     bid INT NOT NULL,   
     PRIMARY KEY (id,bid)  
)  
PARTITION BY KEY(bid)  
PARTITIONS 10;

Query OK, 0 rows affected (0.535 sec)

SQL

CREATE TABLE t1 (  
     id INT NOT NULL,  
     aid DATE NOT NULL,  
     bid INT NOT NULL,    
     UNIQUE KEY (id,bid)  
)  
PARTITION BY KEY(bid)  
PARTITIONS 10;

Query OK, 0 rows affected (0.625 sec)

结果1

这一组例子说明了如果要用bid作为分区key,则bid至少要包含在主键或者唯一键。

分析2

再来看一组例子:

SQL

CREATE TABLE t1 (  
     id INT NOT NULL,  
     aid DATE NOT NULL,  
     bid INT NOT NULL,  
     PRIMARY KEY (id,aid),
     UNIQUE KEY (bid)    
)  
PARTITION BY KEY(bid)  
PARTITIONS 10;

[Err] 1503 - A PRIMARY KEY must include all columns in the table’s partitioning function

SQL

CREATE TABLE t1 (  
     id INT NOT NULL,  
     aid DATE NOT NULL,  
     bid INT NOT NULL,  
     PRIMARY KEY (id,aid),
     UNIQUE KEY (bid)    
)  
PARTITION BY KEY(aid)  
PARTITIONS 10;

[Err] 1503 - A PRIMARY KEY must include all columns in the table’s partitioning function

结果2

这2个分区表是无法建立的,因为没有一个分区键,可以同时属于两个唯一性索引的键。

分析3

下面再来看一组例子:

SQL

CREATE TABLE t1 (  
     id INT NOT NULL,  
     aid DATE NOT NULL,  
     bid INT NOT NULL,  
     PRIMARY KEY (id,aid,bid)   
)  
PARTITION BY KEY(bid)  
PARTITIONS 10;

Query OK, 0 rows affected (0.475 sec)

SQL

CREATE TABLE t1 (  
     id INT NOT NULL,  
     aid DATE NOT NULL,  
     bid INT NOT NULL,  
     UNIQUE KEY (id,aid,bid)   
)  
PARTITION BY KEY(bid)  
PARTITIONS 10;

Query OK, 0 rows affected (0.532 sec)

SQL

CREATE TABLE t1 (  
     id INT NOT NULL,  
     aid DATE NOT NULL,  
     bid INT NOT NULL,  
     PRIMARY KEY (id,aid,bid),
     UNIQUE KEY (bid)    
)  
PARTITION BY KEY(bid)  
PARTITIONS 10;

Query OK, 0 rows affected (0.526 sec)

结果3

这三个都建立分区表成功了,因为bid同时属于一个或以上的唯一性索引的键

最后

通过上面这些例子,大家可以深入的理解Mysql分区中分区键和唯一索引主键的关系了,

主要是,分区的key必须是 主键!

防爬虫说明

禁止 学习某地爬虫,知乎爬虫,CSDN 爬虫。

本文,首发在 learnku 社区。

@author
汪春波(www.shxdledu.cn)

本作品采用《CC 协议》,转载必须注明作者和本文链接
嗨,我是波波。曾经创业,有收获也有损失。我积累了丰富教学与编程经验,期待和你互动和进步! 公众号:上海PHP自学中心 付费知识星球:破解面试:程序员的求职导师
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
司机 @ 欣昊玉
文章
273
粉丝
339
喜欢
558
收藏
1106
排名:64
访问:12.2 万
私信
所有博文
社区赞助商