Oracle 数据库表中已有重复数据添加唯一键(唯一约束)
问题描述
以 demo 举例,模拟真实场景。
表 TEST_TABLE 有如下字段和数据:id 是主键,code 没有设置键和索引
ID | CODE |
---|---|
1 | code1 |
2 | code2 |
3 | code2 |
4 | code2 |
5 | code3 |
通过以上表中数据可以看出 code 是有重复数据的,此时如果我们直接添加唯一键,会报错。
通过 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
解决方案
- 先添加普通索引
CREATE INDEX IDX_TEST_TABLE_CODE ON TEST_TABLE(CODE);
- 再添加唯一键
ALTER TABLE TEST_TABLE ADD CONSTRAINT UK_TEST_TABLE_CODE UNIQUE(CODE) ENABLE NOVALIDATE;
- 如果你对上面提到的基本概念不太清楚,建议继续往下看,或者查找资料去学习,然后多在测试数据库中模拟“犯罪现场”,然后进行还原问题、找问题、分析问题和解决问题。
例子
CREATE INDEX IDX_T_MES_EMPLOYEEINFO_CODE ON T_MES_EMPLOYEEINFO(JOB_NO);ALTER TABLE T_MES_EMPLOYEEINFO ADD CONSTRAINT UK_T_MES_EMPLOYEEINFO_CODE UNIQUE(JOB_NO) ENABLE NOVALIDATE;
CREATE INDEX IDX_BASE_WORK_SHOP_CODE ON BASE_WORK_SHOP(CODE);ALTER TABLE BASE_WORK_SHOP ADD CONSTRAINT UK_BASE_WORK_SHOP_CODE UNIQUE(CODE) ENABLE NOVALIDATE;
基本概念
键、索引、约束的区别
一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念。键代表创建来实施业务规则的完整性约束。索引和键的混淆通常是由于数据库使用索引来实施完整性约束。
- 主键索引和主键有什么关系?
主键索引是创建主键的时候系统自动创建的索引,主键要求不重复,不为空,但是他如何判断有效率呢?当然是建索引了,老是全表遍历还不疯掉。
所以建立主键会自动的建立主键索引。
主键和唯一键的区别在于唯一键可以为空,主键不可以
建立唯一约束和唯一索引又什么区别?
同理,建立唯一约束的时候,也会自动的创建唯一索引。建立唯一索引可以说是唯一约束的一种手段。
基本上,实现起来是没有什么区别的。如果实在理解不了,就当一样好了。
- 聚簇索引和非聚簇索引有何区别?
这个上边已经讲和很详细了,还附有两篇文章,这里就不说了。
- 约束和主键有什么区别?
约束一般有主键约束,外键约束,唯一约束等。
分别为primary key,foreign key,unique 其中主键约束只是约束的一种。
其实他们是不同概念的东西。
Oracle 数据库表中已有重复数据添加唯一键(唯一约束)相关推荐
- oracle数据库表excel文件位置,Excel数据导入到oracle数据库表方法
最近工作中碰到excel文件数据导入oracle数据库表中的技术问题.以前未处理过,决定利用这次机会,好好研究研究. 可先建一临时表,字段和要导入的Excel表的列一致 运行以下SQL语句,使临时表可 ...
- 在oracle数据库表中没有添加rowid字段为什么会出现?
rowid 是 oracle 数据库表中的伪列, rowid 首先是一种数据类型,它唯一标识一条记录物理位置, 基于64位编码的18个字符显示.因为 rowid 是伪列, 所以并未真的存储在表中,但可 ...
- Oracle数据库表中字段顺序的修改方法
Oracle数据库表中字段顺序的修改方法 这篇文章主要给大家介绍了关于Oracle数据库表中字段顺序的修改方法,在介绍修改的方法之前先给大家介绍了Oracle数据库表新建字段的方法,文中通过示例代码介 ...
- oracle 表字段顺序_如何更改Oracle数据库表中字段顺序
软件安装:装机软件必备包 SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.在使用它时,只需要发出& ...
- Oracle数据库----表中数据的操作(插入、更新、删除数据)
文章目录 一.插入数据 插入多行数据的简单方法: 1.将表一的全部数据添加到表二中 创建副本Courses1,只复制Courses的结构 将Courses表中的数据拷贝到Courses1中 创建副本的 ...
- oracle 重复的记录数,如何确定Oracle数据库表中重复的记录
作为一个Oracle数据库开发者或者DBA,在实际工作中经常会遇到这样的问题:试图对库表中的某一列或几列创建唯一索引时,系统提示ORA-01452:不能创建唯一索引,发现重复记录. 下面我们以表cod ...
- oracle删除表中数据_Excel工作表中,删除重复数据的2种方法解读,高效且实用!...
在实际的工作中,经常要对工作表中重复的数据进行删除,如若数据行只有几条,则可通过人工查找出来,如若数据行较多,这种方法就费时费力,而且容易出错,造成对表格数据的准确性和个人能力的怀疑--今天,小编给大 ...
- mysql删除完全重复数据库_MySQL中删除完全重复数据的准确SQL语句
案例: id姓名课程名称分数1张三数学692李四数学893张三数学69删除除了自动编号不同,其他都相同的学生冗余信息 ----------------------------------------- ...
- 怎么解锁oracle数据库表,Oracle数据库表解锁语句
--表解锁 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_ ...
最新文章
- 服务容错保护断路器Hystrix之二:Hystrix工作流程解析
- Kubernetes — Pod
- 编程格式注意事项---后期慢慢补充
- tensorflow学习(4.loss函数以及正则化的使用 )
- 中国农业大学计算机研究生分数线,中国农业大学2017年硕士研究生招生考试复试分数线...
- JQuery radio(单选按钮)操作方法汇总
- 第一篇:Entity Framework 简介
- centos6.5 安装 kong 网关
- mysql c2_Mysql具有C2级安全性
- java spring mvc json ajax 优势_SpringMVC后台json数据前台ajax获取不到!!!急求解答!!!...
- 日常问题——hadoop 任务运行到running job就卡住了 INFO mapreduce.Job: Running job: job_1595222530661_0003
- SqlServer中 Partition By 的使用
- 前端笔记之Vue(五)TodoList实战拆分store跨域练习代理跨域
- 安居客头部导航栏的编写
- WordPress主题制作全过程(八):制作index.php
- 字体下面有背景颜色css,CSS 颜色 字体 背景 文本 边框 列表 display属性
- 这有10款好玩游戏,游戏迷速来围观
- 应用程序无法正常启动0xc000007b win7
- MT2014——打靶
- 2018-2019赛季多校联合新生训练赛第七场补题和题解(中石油)