更新时间:2025-06-04 GMT+08:00
U0000008:GaussDB分布式唯一键必须是分布键的超集
描述
数据库类型与版本
- 源库类型与版本:所有涉及唯一约束或唯一索引的源数据库类型。
- 目标库类型与版本:GaussDB分布式版。
语法示例
GaussDB 分布式 CREATE TABLE 在不显式指定分布键的情况下,默认分布键的选取规则如下:
- 无主键、无唯一键时,分布键为表中第一个符合分布键数据类型要求的列;
- 主键或唯一键单独存在时,分布键为主键或唯一键的第一个列;
- 主键及唯一键同时存在时,根据 GaussDB 版本以及唯一键存在的形式的不同,规则有所差异:
- 当在 CREATE TABLE 语句中声明唯一键时:
- 如果是 GaussDB 分布式 V2.0-2.7 版本,分布键默认使用主键中的第一个列,并且要求表内所有唯一键均必须包含该分布键,否则将提示错误,如下建表语句所示:
create table distributed_table1 ( id int primary key, name int, constraint pk_unique1 unique(name) );
对于建表语句,GaussDB 将默认使用 id 列作为分布键, 而唯一约束 pk_unique1 中未包含分布键 id 列,GaussDB 分布式 V2.0-2.7 版本不支持,UGO 将提示此错误。
- 如果是 GaussDB 分布式 V2.0-2.7 以上的版本,对于与上述同样的场景,GaussDB 不再要求 CREATE TABLE 语句中的唯一键必须包含分布键,GaussDB 在处理这类建表语句时,会自动创建全局二级索引。
- 如果是 GaussDB 分布式 V2.0-2.7 版本,分布键默认使用主键中的第一个列,并且要求表内所有唯一键均必须包含该分布键,否则将提示错误,如下建表语句所示:
- 当使用 CREATE INDEX 或 ALTER TABLE 语句添加唯一约束或者唯一索引时,GaussDB 所有版本均要求唯一键包含表分布键,如下示例所示:
create table distributed_table2 ( id int, name int, student int ); create unique index pk_unique2 on distributed_table2(student);
由于建表语句既没有主键也没有唯一键,所以 GaussDB 默认使用 id 列作为分布键。而在执行创建唯一索引语句时,pk_unique2 中未包含分布键 id 列,GaussDB 不支持,UGO 将提示此错误。
- 当在 CREATE TABLE 语句中声明唯一键时:
改造建议
修改“唯一约束或唯一索引中不包含分布键”转换配置项。根据实际需要,选择将唯一键转为非唯一索引,或在唯一键中添加分布键。
父主题: 通用转换错误码