19.6.1 Partitioning Keys, Primary Keys, and Unique Keys
이 섹션에서는 파티셔닝 키와 기본 키 및 고유 키와의 관계에 대해 설명합니다. 이 관계를 제어하는 규칙은 다음과 같이 표현할 수 있습니다. 파티션 된 테이블의 파티셔닝 식에 사용되는 모든 컬럼은 테이블이 가질 수있는 모든 고유 키의 일부 여야합니다.
즉, 테이블의 모든 고유 키는 테이블의 파티셔닝 식의 모든 컬럼을 사용해야합니다 (여기에는 테이블의 기본 키도 포함됩니다 (자명 고유 키이므로)이 점은이 섹션에서 설명합니다). 예를 들어, 다음의 각 테이블 생성 구문이 잘못되었습니다.
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;
두 경우 모두, 작성된 테이블은 파티셔닝 식에 사용 된 모든 컬럼을 포함하지 않는 고유 키가 하나 있습니다.
다음의 각 명령문이 유효 해당 잘못된 테이블 생성 문을 작동 한 가지 방법을 보여줍니다.
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;
ERROR 1491 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function
이 CREATE TABLE
문은 지정된 파티션 키에 col1
및 col3
이 포함되어 있지만 이러한 열 모두 테이블 모두 고유 키의 일부가 아니므로 실패합니다. 잘못된 테이블 정의의 가능한 해결 방법 중 하나를 보여줍니다.
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;
Query OK, 0 rows affected (0.05 sec)
이 경우 지정된 파티션 키 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) );
모든 기본 키는 자명 고유 키이기 때문에이 제약은 테이블의 기본 키도 포함됩니다 (있는 경우). 예를 들어, 다음 두 명령문은 유효하지 않습니다.
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;
두 경우 모두 파티셔닝 식으로 참조되는 모든 컬럼이 기본 키에 포함되지 않습니다. 그러나 다음의 두 문장은 모두 유효합니다.
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;
테이블에 고유 키가없는 경우 (기본 키가없는 경우를 포함한다)는이 제한이 적용되지 않고, 컬럼 형이 파티션 유형과 호환되는 한, 분할 식에 임의의 컬럼을 사용할 수 있습니다.
같은 이유로 테이블의 파티셔닝 식에 사용되는 모든 컬럼이 고유 키에 포함되어있는 경우를 제외하고 파티션 된 테이블에 나중에 고유 키를 추가 할 수 없습니다. 다음과 같이 생성 된 파티션 된 테이블이 있다고합니다.
mysql>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)
->);
Query OK, 0 rows affected (0.12 sec)
다음 중 하나의 ALTER TABLE
문을 사용하여 t_no_pk
에 기본 키를 추가 할 수 있습니다.
# possible PK mysql>ALTER TABLE t_no_pk ADD PRIMARY KEY(c1);
Query OK, 0 rows affected (0.13 sec) Records: 0 Duplicates: 0 Warnings: 0 # drop this PK mysql>ALTER TABLE t_no_pk DROP PRIMARY KEY;
Query OK, 0 rows affected (0.10 sec) Records: 0 Duplicates: 0 Warnings: 0 # use another possible PK mysql>ALTER TABLE t_no_pk ADD PRIMARY KEY(c1, c2);
Query OK, 0 rows affected (0.12 sec) Records: 0 Duplicates: 0 Warnings: 0 # drop this PK mysql>ALTER TABLE t_no_pk DROP PRIMARY KEY;
Query OK, 0 rows affected (0.09 sec) Records: 0 Duplicates: 0 Warnings: 0
그러나 다음 명령문은 실패합니다. c1
은 파티셔닝 키의 일부이지만 지정된 기본 키의 일부가 아니기 때문입니다.
# fails with error 1503
mysql> ALTER TABLE t_no_pk ADD PRIMARY KEY(c2);
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function
t_no_pk
파티셔닝 식은 c1
에만 있기 때문에 c2
에만 고유 키를 추가하려고하면 실패합니다. 그러나 c1
과 c2
를 모두 사용하는 고유 키는 추가 할 수 있습니다.
이 규칙은 기존의 분할되지 않은 테이블을 ALTER TABLE ... PARTITION BY
를 사용하여 분할하는 경우에도 적용됩니다. 다음과 같이 생성 된 테이블 np_pk
가 있다고합니다.
mysql>CREATE TABLE np_pk (
->id INT NOT NULL AUTO_INCREMENT,
->name VARCHAR(50),
->added DATE,
->PRIMARY KEY (id)
->);
Query OK, 0 rows affected (0.08 sec)
다음 ALTER TABLE
문은 added
열이 테이블의 고유 키의 일부가 아니므로 오류로 실패합니다.
mysql>ALTER TABLE np_pk
->PARTITION BY HASH( TO_DAYS(added) )
->PARTITIONS 4;
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function
그러나 다음과 같이 파티셔닝 컬럼에 id
컬럼을 사용하는 다음 명령문은 유효합니다.
mysql>ALTER TABLE np_pk
->PARTITION BY HASH(id)
->PARTITIONS 4;
Query OK, 0 rows affected (0.11 sec) Records: 0 Duplicates: 0 Warnings: 0
np_pk
의 경우 분할 식의 일부로 사용할 수있는 유일한 컬럼은 id
입니다. 이 테이블을 파티셔닝 식으로 다른 컬럼을 사용하여 분할하려면 원하는 컬럼을 기본 키에 추가하거나 기본 키를 모두 삭제하여 먼저 테이블을 변경해야합니다.