分区的约束和某些限制,会影响到表的设计,该怎么办?

【TiDB 版本】:

3.0.5

【问题描述】:

根据官方文档中所提到的 分区表的每个唯一键,必须包含分区表达式中用到的所有列。的限制

下面这个表就没法做分区了,因为无论如何都不可能找到满足条件的分区键:

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

如果要满足这个限制的条件,我必须要重新设计我的数据表,例如我要根据 col2 列进行表分区:

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

但实际上我并不需要双主键

tidb 的分区表和 mysql 的分区表在唯一键的设计上是一致的。在 mysql 和 tidb 中,分区索引是本地分区索引,暂时没有全局索引。所以在对分区表有唯一键需求时,需要加上分区键以确保数据的唯一性。

  1. mysql 相关的官方文档如下:

https://dev.mysql.com/doc/refman/5.7/en/partitioning-limitations-partitioning-keys-unique-keys.html

  1. tidb 分区表文档如下:

老师你说的我明白了也理解了, 因为本地分区索引的原因,所在在设置唯一键时,要保证数据的唯一性加上唯一索引;

但是 MySQL为什么这么设计我还想不通, 强制变成多主键,单列数据就不能够保证唯一了啊!

针对上述疑问:建议参考下 mysql 的本地分区索引,以及 oracle 的全局索引的相关内容理解一下。