UNIQUE CHECK IGNORE

PolarDB MySQL版支持分区表主键不包含分区键(UNIQUE CHECK IGNORE, 简称UCI)。UCI在数据库引擎版本8.0.2.2.17及以上支持。

说明
  • 分区表主键不包含分区键(UCI)功能当前处于灰度发布阶段。如有需求,请前往配额中心,根据配额IDpolardb_mysql_uci找到配额名称,在对应的操作列单击申请来开通该功能。

  • 如需了解更多关于主键不包含分区键(UCI)的内容,请搜索钉钉群号加群进行咨询。钉钉群号:24490017825。

语法

UCI是PolarDB创建表table_options的一个属性。创建表时指定UNIQUE CHECK IGNORE=1表示该表忽略分区键的唯一性检查,不再考虑分区键与主键和唯一键的关系,可以选择任意列做分区键。语法如下:

CREATE TABLE [ schema. ]table_name
 table_definition table_options
   PARTITION BY ...
   SUBPARTITION BY ...

其中,table_options中增加了一个选项UNIQUE CHECK IGNORE = { 1| 0 }UNIQUE CHECK IGNORE=1表示主键和唯一键不需要必须包含分区键的所有列,使得分区键的选择更加灵活。但是无法保证数据主键和唯一键在分区间的唯一性,也就是主键和唯一键的唯一性仅在分区内部有效,在分区间不做限制。

说明
  • 表属性UNIQUE CHECK IGNORE只能用于分区表,普通的非分区表添加此属性会报错。

  • 表属性UNIQUE CHECK IGNORE为只读属性,您不能修改UNIQUE CHECK IGNORE属性的值。

  • UCI分区表无法保证主键的唯一性。以确保主键的唯一性,必须创建主键字段的唯一全局二级索引(GSI)。否则,不同的分区允许出现重复的主键字段值。具体操作请参见示例二

  • UCI分区表无法保证不包含分区键的唯一索引的唯一性,建议创建成唯一全局二级索引(GSI)

参数

参数名称

参数说明

table_name

要创建的表名称。

示例

示例一

CREATE TABLE t1(
        a INT PRIMARY KEY,
        b INT UNIQUE,
        c INT
    ) UNIQUE CHECK IGNORE=1
    PARTITION BY RANGE(c) (
            PARTITION p0 VALUES LESS THAN (20) ,
            PARTITION p1 VALUES LESS THAN (40) ,
            PARTITION p2 VALUES LESS THAN (60)
    );

示例二

// 唯一全局二级索引保证主键唯一性
CREATE TABLE t1(
        a INT PRIMARY KEY,
        b INT UNIQUE,
        c INT,
        UNIQUE KEY i_a_g(a) GLOBAL
    ) UNIQUE CHECK IGNORE=1
    PARTITION BY HASH(c) PARTITIONS 11;