10bet网址
MySQL 5.6リファレンスマニュアル
本手册下载
PDF (Ltr)- 26.8 mb
PDF (A4)- 26.8 mb
HTML下载(TGZ)- 7.2 mb
HTML下载(邮政编码)- 7.2 mb


19.6.1パーティショニングキー,主キー,および一意キー

このセクションでは,パーティショニングキーと主キーおよび一意キーとの関係について説明します。この関係を制御するルールは次のように表現できます。パーティション化されたテーブルのパーティショニング式で使用されるすべてのカラムは、テーブルが持つことができるすべての一意キーの一部である必要があります。

つまり,テーブルのすべての一意キーは,テーブルのパーティショニング式内のすべてのカラムを使用する必要があります(これには,テーブルの主キーも含まれます(自明で一意キーであるため)。この点については,このセクションで後述します)。たとえば,次の各テーブル作成ステートメントは無効です。

CREATE TABLE t1 (col1 INT NOT NULL, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, UNIQUE KEY (col1, col2)) PARTITION BY HASH(col3) PARTITIONS 4;CREATE TABLE t2 (col1 INT NOT NULL, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, UNIQUE KEY (col1), UNIQUE KEY (col3)) PARTITION BY HASH(col1 + col3) PARTITIONS 4;

どちらの場合も,記述されたテーブルには,パーティショニング式に使用されているすべてのカラムを含んでいない一意キーが少なくとも1つあります。

次の各ステートメントは有効で,対応する無効なテーブル作成ステートメントを機能させる1つの方法を示しています。

CREATE TABLE t1 (col1 INT NOT NULL, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, UNIQUE KEY (col1, col2, col3)) PARTITION BY HASH(col3) PARTITIONS 4;CREATE TABLE t2 (col1 INT NOT NULL, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, UNIQUE KEY (col1, col3)) PARTITION BY HASH(col1 + col3) PARTITIONS 4;

次の例は,そのような場合に生成されるエラーを示しています。

mysql> CREATE TABLE t3 (-> col1 INT NOT NULL, -> col2 DATE NOT NULL, -> col3 INT NOT NULL, -> col4 INT NOT NULL, -> UNIQUE KEY (col1, col2), -> UNIQUE KEY (col3) ->) -> PARTITION BY HASH(col1 + col3) -> PARTITIONS 4;错误1491 (HY000):主键必须包括表的分区功能中的所有列

この创建表ステートメントは,指定されたパーティショニングキーにcol1およびcol3が含まれているけれども,これらのカラムのいずれもテーブルの両方の一意キーの一部でないために,失敗します。無効なテーブル定義の考えられる解決策の1つを次に示します。

mysql> CREATE TABLE t3 (-> col1 INT NOT NULL, -> col2 DATE NOT NULL, -> col3 INT NOT NULL, -> col4 INT NOT NULL, -> UNIQUE KEY (col1, col2, col3), -> UNIQUE KEY (col3) ->) -> PARTITION BY HASH(col3) -> PARTITIONS 4;查询OK,受影响0行(0.05秒)

この場合,指定されたパーティショニングキーcol3は両方の一意キーの一部であるため,このテーブル作成ステートメントは成功します。

次のテーブルは,両方の一意キーに属するカラムをパーティショニングキーに含めることができないため,パーティション化できません。

CREATE TABLE t4 (col1 INT NOT NULL, col2 INT NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, UNIQUE KEY (col1, col3), UNIQUE KEY (col2, col4));

すべての主キーは自明で一意キーであるため,この制約にはテーブルの主キーも含まれます(ある場合)。たとえば,次の2つのステートメントは無効です。

CREATE TABLE t5 (col1 INT NOT NULL, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, PRIMARY KEY(col1, col2)) PARTITION BY HASH(col3) PARTITIONS 4;CREATE TABLE t6 (col1 INT NOT NULL, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, PRIMARY KEY(col1, col3), UNIQUE KEY(col2)) PARTITION BY HASH(YEAR(col2)) PARTITIONS 4;

どちらの場合も,パーティショニング式で参照されるすべてのカラムが主キーに含まれていません。ただし,次の2つのステートメントは両方とも有効です。

CREATE TABLE t7 (col1 INT NOT NULL, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, PRIMARY KEY(col1, col2)) PARTITION BY HASH(col1 + YEAR(col2)) PARTITIONS 4;CREATE TABLE t8 (col1 INT NOT NULL, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, PRIMARY KEY(col1, col2, col4), UNIQUE KEY(col2, col1)) PARTITION BY HASH(col1 + YEAR(col2)) PARTITIONS 4;

テーブルに一意キーがない場合(主キーがない場合を含む)はこの制約は適用されず,カラム型がパーティショニングタイプと互換性があるかぎり,パーティショニング式に任意のカラムを使用できます。

同じ理由で,テーブルのパーティショニング式で使用されるすべてのカラムが一意キーに含まれている場合を除き,パーティション化されたテーブルにあとから一意キーを追加することはできません。次のように作成されたパーティション化されたテーブルがあるとします。

CREATE TABLE t_no_pk (c1 INT, c2 INT) -> PARTITION BY RANGE(c1) (-> PARTITION p0 VALUES LESS THAN (10), -> PARTITION p1 VALUES LESS THAN (20), -> PARTITION p2 VALUES LESS THAN (30), -> PARTITION p3 VALUES LESS THAN (40) ->);查询OK, 0行受影响(0.12秒)

次のいずれかのALTER TABLEステートメントを使用することで,t_no_pkに主キーを追加できます。

#可能PK mysql> ALTER TABLE t_no_pk ADD PRIMARY KEY(c1);# drop this PK mysql> ALTER TABLE t_no_pk drop PRIMARY KEY;#使用另一个可能的PK mysql> ALTER TABLE t_no_pk ADD PRIMARY KEY(c1, c2);# drop this PK mysql> ALTER TABLE t_no_pk drop PRIMARY KEY;查询OK, 0行影响(0.09 sec)记录:0重复:0警告:0

ただし,次のステートメントは失敗します。c1は,パーティショニングキーの一部ですが,指定された主キーの一部ではないためです。

mysql> ALTER TABLE t_no_pk ADD PRIMARY KEY(c2);ERROR 1503 (HY000): PRIMARY KEY必须包含表的分区功能中的所有列

t_no_pkのパーティショニング式はc1のみであるため,c2のみに一意キーを追加しようとすると失敗します。ただし,c1およびc2の両方を使用する一意キーは追加できます。

これらのルールは,既存のパーティション化されていないテーブルをALTER TABLE……分区的を使用してパーティション化するときにも適用されます。次のように作成されたテーブルnp_pkがあるとします。

mysql> CREATE TABLE np_pk (-> id INT NOT NULL AUTO_INCREMENT, -> name VARCHAR(50), -> added DATE, -> PRIMARY KEY (id) ->);查询OK, 0行受影响(0.08秒)

次のALTER TABLEステートメントは,添加カラムがテーブルの一意キーの一部でないため,エラーで失敗します。

mysql> ALTER TABLE np_pk -> PARTITION BY HASH(TO_DAYS(added)) -> PARTITIONS 4;ERROR 1503 (HY000): PRIMARY KEY必须包含表的分区功能中的所有列

ただし,次に示すように,パーティショニングカラムにidカラムを使用する次のステートメントは有効です。

mysql> ALTER TABLE np_pk -> PARTITION BY HASH(id) -> PARTITIONS 4;查询OK, 0行影响(0.11秒)记录:0重复:0警告:0

np_pkの場合,パーティショニング式の一部として使用できる唯一のカラムはidです。このテーブルをパーティショニング式でほかのカラムを使用してパーティション化する場合は、目的のカラムを主キーに追加するか、主キーをすべて削除することによって、まずテーブルを変更する必要があります。