今天一个一起搬砖的兄弟同事过来问,为什么他的索引删不掉?我过去看了下:
执行脚本:
drop index constraint_unique
报错如下:
执行时出错 确认要继续执行吗?
单击“详细信息”了解详情。
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_unique在表t1上来代替它。
于是我执行drop constraint的语句,删除成功。
alter table t1 drop CONSTRAINT constraint_unique;
究其原因,该索引并不是通过create index直接创建的,而是在创建唯一约束的时候顺带创建的。实验发现,openGauss在创建唯一约束的时候,同时会创建一个唯一索引,当然在删除唯一约束的同时,也会删除掉创建唯一约束时附带创建的唯一索引;
但是在创建唯一索引的时候,并不会同时显式创建一个唯一约束。通过创建索引直接创建的索引,好像有点绕咔咔咔,则可以直接通过drop index的方式删除。
再对比下创建唯一索引和唯一约束后,在插入重复数据时的区别:
- 唯一索引:插入重复数据时报错,插入时也报唯一约束冲突
ERROR: duplicate key value violates unique constraint “idx_unique”
Detail: Key (c1)=(1) already exists.
- 唯一约束:
ERROR: duplicate key value violates unique constraint “constraint_unique”
Detail: Key (c1)=(1) already exists.
那么约束是否存在呢?我对于增加唯一约束的场景,尝试执行 drop constraint的操作,系统会报错constraint不存在,这说明确实没有创建约束。
执行时出错 确认要继续执行吗?
单击“详细信息”了解详情。
SQL错误码: = 42704
ERROR: constraint “idx_unique” of relation “test” does not exist
行号: 2文章来源:https://www.toymoban.com/news/detail-405835.html
来自:如鱼得水文章来源地址https://www.toymoban.com/news/detail-405835.html
到了这里,关于openGauss中创建唯一索引和创建唯一约束的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!