Oracle 数据库表中已有重复数据添加惟一键(惟一约束)

Oracle 数据库表中已有重复数据添加惟一键(惟一约束)

问题描述

以 demo 举例,模拟真实场景。html

表 TEST_TABLE 有以下字段和数据:id 是主键,code 没有设置键和索引数据库

ID CODE
1 code1
2 code2
3 code2
4 code2
5 code3

经过以上表中数据能够看出 code 是有重复数据的,此时若是咱们直接添加惟一键,会报错。oracle

经过 PL/SQL 可视化操做,或者经过 SQL 语句添加(ENABLE NOVALIDATE 的做用是约束新增数据但不会验证已有数据):ALTER TABLE TEST_TABLE ADD CONSTRAINT UK_TEST_TABLE_CODE UNIQUE(CODE) ENABLE NOVALIDATE;学习

即便用到了 ENABLE NOVALIDATE 也报错,以下:测试

ORA-02299: cannot validate(TESTUSER.TEST_TABLE.UK_TEST_TABLE_CODE)-duplicate keys found

--Create/Recreate primary, unique and foreign key constraints alter table TEST_TABLE and constraint UK_TEST_TABLE_CODE unique(CODE) novalidate

解决方案

  1. 先添加普通索引
    • CREATE INDEX IDX_TEST_TABLE_CODE ON TEST_TABLE(CODE);
  2. 再添加惟一键
    • ALTER TABLE TEST_TABLE ADD CONSTRAINT UK_TEST_TABLE_CODE UNIQUE(CODE) ENABLE NOVALIDATE;

若是你对上面提到的基本概念不太清楚,建议继续往下看,或者查找资料去学习,而后多在测试数据库中模拟“犯罪现场”,而后进行还原问题、找问题、分析问题和解决问题。code

基本概念

键、索引、约束的区别

通常,咱们看到术语“索引”和“键”交换使用,但实际上这两个是不一样的。索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念。键表明建立来实施业务规则的完整性约束。索引和键的混淆一般是因为数据库使用索引来实施完整性约束。htm

  1. 主键索引和主键有什么关系?

主键索引是建立主键的时候系统自动建立的索引,主键要求不重复,不为空,可是他如何判断有效率呢?固然是建索引了,总是全表遍历还不疯掉。blog

因此创建主键会自动的创建主键索引。索引

  1. 主键和惟一键的区别在于惟一键能够为空,主键不能够get

  2. 创建惟一约束和惟一索引又什么区别?

同理,创建惟一约束的时候,也会自动的建立惟一索引。创建惟一索引能够说是惟一约束的一种手段。

基本上,实现起来是没有什么区别的。若是实在理解不了,就当同样好了。

  1. 聚簇索引和非聚簇索引有何区别?

这个上边已经讲和很详细了,还附有两篇文章,这里就不说了。

  1. 约束和主键有什么区别?

约束通常有主键约束,外键约束,惟一约束等。

分别为primary key,foreign key,unique 其中主键约束只是约束的一种。

其实他们是不一样概念的东西。

参考资料

相关文章
相关标签/搜索