Oracle 数据库表中已有重复数据添加唯一键(唯一约束)
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;
如果你对上面提到的基本概念不太清楚,建议继续往下看,或者查找资料去学习,然后多在测试数据库中模拟“犯罪现场”,然后进行还原问题、找问题、分析问题和解决问题。
基本概念
键、索引、约束的区别
一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念。键代表创建来实施业务规则的完整性约束。索引和键的混淆通常是由于数据库使用索引来实施完整性约束。
- 主键索引和主键有什么关系?
主键索引是创建主键的时候系统自动创建的索引,主键要求不重复,不为空,但是他如何判断有效率呢?当然是建索引了,老是全表遍历还不疯掉。
所以建立主键会自动的建立主键索引。
主键和唯一键的区别在于唯一键可以为空,主键不可以
建立唯一约束和唯一索引又什么区别?
同理,建立唯一约束的时候,也会自动的创建唯一索引。建立唯一索引可以说是唯一约束的一种手段。
基本上,实现起来是没有什么区别的。如果实在理解不了,就当一样好了。
- 聚簇索引和非聚簇索引有何区别?
这个上边已经讲和很详细了,还附有两篇文章,这里就不说了。
- 约束和主键有什么区别?
约束一般有主键约束,外键约束,唯一约束等。
分别为primary key,foreign key,unique 其中主键约束只是约束的一种。
其实他们是不同概念的东西。
参考资料
- https://www.cnblogs.com/dayang12525/articles/7762634.html
- http://blog.sina.com.cn/s/blog_82ee2ee60100xwl4.html
Oracle 数据库表中已有重复数据添加唯一键(唯一约束)的更多相关文章
- 删除oracle表中的完全重复数据
今天数据库除了个问题:项目中的一张表,数据是从另外一个系统中相同的表里弄过来的,但是可能由于昨天同事导数据导致我这张表中的数据出现了完全相同的情况(所有字段),全部是两条,需要删除相同的数据. 做法: ...
- oracle数据库表中,插入数据的时候如何产生一个 字母+数字 编号?
Oracle 语句中“||”代表什么啊? oracle数据库表中,插入数据的时候如何产生一个 字母+数字 编号? 排序的话,用order by来处理即可.比如:cola123a234b999b335s ...
- 在oracle数据库表中没有添加rowid字段为什么会出现?
rowid 是 oracle 数据库表中的伪列, rowid 首先是一种数据类型,它唯一标识一条记录物理位置, 基于64位编码的18个字符显示.因为 rowid 是伪列, 所以并未真的存储在表中,但可 ...
- Sql server的Merge语句,源表中如果有重复数据会导致执行报错
用过sql server的Merge语句的开发人员都应该很清楚Merge用来做表数据的插入/更新是非常方便的,但是其中有一个问题值得关注,那就是Merge语句中的源表中不能出现重复的数据,我们举例来说 ...
- 针对Oracle数据库表中的数据的常见操作
1.查询表中所有数据 select * from 表名; 例:select * from stu; 2.查询的同时修改表中数据 select * from 表名 for update; 例:sele ...
- 使用sqlldr命令导入资料到Oracle数据库表中的示例说明
CSV: Comma-Separated Values(逗号分隔值)的缩写,是以逗号分隔字段的多行文本文件 sqlldr 是sql*loader的缩写,此工具在安装完整版的Oracle客户端后就有 ...
- 【MySQL】测试MySQL表中安全删除重复数据只保留一条的相关方法
第二篇文章测试说明 开发测试中,难免会存在一些重复行数据,因此常常会造成一些测试异常. 下面简单测试mysql表删除重复数据行的相关操作. 主要通过一下三个大标题来测试说明: 02.尝试删除dept_ ...
- FlowPortal-BPM——功能:判断数据库表中字段是否重复并阻止提交或保存
一.JS添加代码,判断是否有OnSubmit事件 文件位置:YZSoft/Forms/src/Validator.js //=====判断是否有OnSubmit事件===== if (typeof ( ...
- [置顶] oracle 数据库表中转换成java代码
--数据库中字段java代码 select col.TABLE_NAME,replace(initcap(col.TABLE_NAME),'_', '') , 'private '||decode ...
随机推荐
- 用实例讲DynamicResource与StaticResource的区别
原文:用实例讲DynamicResource与StaticResource的区别 之前我的博客文章"WPF中的资源(Resource)"中概略性地提到过DynamicResourc ...
- 在WPF中添加3D特性
原文:在WPF中添加3D特性 35.4 在WPF中添加3D特性 本节介绍WPF中的3D特性,其中包含了开始使用该特性的信息. 提示: WPF中的3D特性在System.Windows.Media.M ...
- python3 小技巧(2)
原文 http://blog.csdn.net/jclass/article/details/6145078 一. base64 编码和解码任意的二进制字符串到文本字符串(主要用在HTTP EMAIL ...
- 国内大型的内部 C# 编程规范
C#编程规范 改动记录 Ver. No 发版日期 编制人 批准人 改动的说明 目 录 1 1.1 1.2 2 2.1 2.1.1 Pascal 大写和小写 2.1.2 Came ...
- 安装在谷歌axure小工具
下载插件 第一步 第二步 第三步 第四步 版权声明:本文博客原创文章.博客,未经同意,不得转载.
- 线程安全ConcurrentBag
ConcurrentBag并行,不保证顺序,线程安全 public static void ConcurrentBagWithPallel() { ConcurrentBag<int> l ...
- ASP.NET Core 配置身份验证
以AspUser的Password为例,去掉最少1个大写字母,1个小写字母等等坑爹的要求在Startup的ConfigureServices中进行配置 services.Configure<Id ...
- OpenGL红宝书附带源码编译问题集锦
以下所有源码均在win7,VS2008环境下测试.下不再赘述. 1.所有的.c扩展名请改为.cpp扩展名,以避免不可预测的错误. 想知道会出现什么不可预测的错误..请见我上一篇Blog... 2.如果 ...
- SyncML是一平台无关的信息同步标准协议集
SyncML (Synchronization Markup Language)是一平台无关的信息同步标准协议集.分为SyncML数据传输协议(SyncML-DS)和SyncML设备管理协议(Sync ...
- 微信小程序把玩(十五)checkbox组件
原文:微信小程序把玩(十五)checkbox组件 不得不吐糟下checkbox默认样式真是有点略丑!!!checkbox组件为一个多选框被放到checkbox-group组中,并在checkbox-g ...