文档首页/ 数据库和应用迁移 UGO/ 用户指南/ 语法转换指南/ 转换错误码/ 通用转换错误码/ U0000008:GaussDB分布式唯一键必须是分布键的超集
更新时间:2025-06-04 GMT+08:00

U0000008:GaussDB分布式唯一键必须是分布键的超集

描述

数据库类型与版本

  • 源库类型与版本:所有涉及唯一约束或唯一索引的源数据库类型。
  • 目标库类型与版本:GaussDB分布式版。

语法示例

GaussDB 分布式 CREATE TABLE 在不显式指定分布键的情况下,默认分布键的选取规则如下:

  1. 无主键、无唯一键时,分布键为表中第一个符合分布键数据类型要求的列;
  2. 主键或唯一键单独存在时,分布键为主键或唯一键的第一个列;
  3. 主键及唯一键同时存在时,根据 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 在处理这类建表语句时,会自动创建全局二级索引。
    • 当使用 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 将提示此错误。

改造建议

修改“唯一约束或唯一索引中不包含分布键”转换配置项。根据实际需要,选择将唯一键转为非唯一索引,或在唯一键中添加分布键。