开发者
资源
OpenGauss中创建唯一索引和创建唯一约束的区别
OpenGauss中创建唯一索引和创建唯一约束的区别
发表于2023/03/08
3301

OpenGauss中创建唯一索引和创建唯一约束的区别

今天一个一起搬砖的兄弟同事过来问,为什么他的索引删不掉?我过去看了下:

执行脚本:

drop index constraint_unique

报错如下:

cke_4614.png

执行时出错 确认要继续执行吗? 

单击详细信息了解详情。 

  SQL错误码: = 2BP01 

ERROR: cannot drop index constraint_unique because constraint constraint_unique on table t1 requires it 

  Hint: You can drop constraint constraint_unique on table t1 instead. 

 行号: 19 

报错大意是:不能删除索引constraint_unique因为约束constraint_unique在表t1上引用了它。

暗示:你可以删除约束constraint_uniquet1上来代替它。

于是我执行drop constraint的语句,删除成功。

alter table t1 drop CONSTRAINT  constraint_unique

究其原因,该索引并不是通过create index直接创建的,而是在创建唯一约束的时候顺带创建的。实验发现,OpenGauss在创建唯一约束的时候,同时会创建一个唯一索引,当然在删除唯一约束的同时,也会删除掉创建唯一约束时附带创建的唯一索引;

cke_12305.png

但是在创建唯一索引的时候,并不会同时显式创建一个唯一约束。通过创建索引直接创建的索引,好像有点绕咔咔咔,则可以直接通过drop index的方式删除。

cke_18455.png

再对比下创建唯一索引和唯一约束后,在插入重复数据时的区别:

1. 唯一索引:插入重复数据时报错,插入时也报唯一约束冲突(有点奇怪)

cke_26068.png

ERROR: duplicate key value violates unique constraint "idx_unique" 

  Detail: Key (c1)=(1) already exists.

2. 唯一约束:

cke_32516.png

ERROR: duplicate key value violates unique constraint "constraint_unique" 

  Detail: Key (c1)=(1) already exists.

那么约束是否存在呢?我对于增加唯一约束的场景,尝试执行 drop constraint的操作,系统会报错constraint不存在,这说明确实没有创建约束,但还是报唯一约束冲突,有点小困惑。

cke_40099.png

执行时出错 确认要继续执行吗? 

单击详细信息了解详情。 

  SQL错误码: = 42704 

ERROR: constraint "idx_unique" of relation "test" does not exist 

 行号:

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞