
# 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 将提示此错误。
     
    
 
#### 改造建议
修改"唯一约束或唯一索引中不包含分布键"转换配置项。根据实际需要，选择将唯一键转为非唯一索引，或在唯一键中添加分布键。
