PolarDB MySQL版支持分区表主键不包含分区键(UNIQUE CHECK IGNORE, 简称UCI)。UCI在数据库引擎版本8.0.2.2.17及以上支持。
分区表主键不包含分区键(UCI)功能当前处于灰度发布阶段。如有需求,请前往配额中心,根据配额ID
polardb_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;