天天看點

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

主鍵必須包括表的分區函數中的所有列,一個惟一的索引必須包括表的分區函數中的所有列,是不是不太好了解意思

其實就是這麼個意思:表上的每一個唯一性索引必須用于分區表的表達式上(其中包括主鍵索引) 

下面我來舉幾個例子:

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

CREATE TABLE t1 (  
     id INT NOT NULL,  
     aid DATE NOT NULL,  
     bid INT NOT NULL,    
     UNIQUE KEY (id)  
)  
PARTITION BY KEY(bid)  
PARTITIONS 10;      
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)

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)

這一組例子說明了如果要用bid作為分區key,則bid至少要包含在主鍵或者唯一鍵。

再來看一組例子:

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;      
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;      

這2個分區表是無法建立的,因為沒有一個分區鍵,可以同時屬于兩個唯一性索引的鍵。

下面再來看一組例子:

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)

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)

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)

這三個都建立分區表成功了,因為bid同時屬于一個或以上的唯一性索引的鍵

通過上面這些例子,大家可以深入的了解Mysql分區中分區鍵和唯一索引主鍵的關系了,希望對大家有所幫助。