违反唯一性约束的两种可能:唯一约束or唯一索引

article/2025/8/28 0:24:34

ORA-00001: 违反唯一约束条件 这一个报错相信大家在插入数据时还是经常遇到的,尤其是在测试环境。
但是今天我在处理一个生产问题的时候再次遇到这个报错时有点奇怪:
在这里插入图片描述
1.该表(记为表A)的主键是数据库序列生成的,不存在测试环境常见的因为插入测试数据导致后续通过数据库序列生成的主键冲突的问题
2.检查了数据库表结构的约束,发现只有主键约束。在这里插入图片描述
然后检查了插入数据的SQL,如下:

MERGE INTO EIS_INSU_FILE_CABIN A
USING (SELECT BUSI_ID, APPLY_ID, MD5_KEY, CAFILE_PATH, CAFILE_NAMEFROM EIS_INSU_SIGN_INFO AWHERE A.SIGN_CATE = 31AND A.BUSI_ID = '5800'AND A.APPLY_ID = '5800'AND A.SIGN_STATUS IN (3, 4)) B
ON (A.BUSI_ID = B.BUSI_ID AND A.APPLY_ID = B.APPLY_ID AND A.FILE_TYPE = 220)
WHEN MATCHED THENUPDATESET A.FILE_PATH = B.CAFILE_PATH,A.FILE_NAME = B.CAFILE_NAME,A.MD5_KEY   = B.MD5_KEY
WHEN NOT MATCHED THENINSERT(FILE_ID,BUSI_CATE,BUSI_ID,APPLY_ID,FILE_TYPE,PAGE_NO,FILE_PATH,FILE_NAME,MD5_KEY)VALUES(SEIS_INSU_FILE_CABIN_ID.NEXTVAL,6,B.BUSI_ID,B.APPLY_ID,220,1,B.CAFILE_PATH,B.CAFILE_NAME,B.MD5_KEY);

因为这个SQL还涉及到对MERGE INTO语法的理解,简单来说就是下面这个查询脚本的查询结果如果不为空就对查询结果进行更新,如果查询结果为空就进行插入,但是插入的条数实际是与B中的结果条数有关(此处为2条)

SELECT A.*FROM EIS_INSU_FILE_CABIN A,(SELECT BUSI_ID, APPLY_ID, MD5_KEY, CAFILE_PATH, CAFILE_NAMEFROM EIS_INSU_SIGN_INFO AWHERE A.SIGN_CATE = 31AND A.BUSI_ID = '5800'AND A.APPLY_ID = '5800'AND A.SIGN_STATUS IN (3, 4)) BWHERE A.BUSI_ID = B.BUSI_IDAND A.APPLY_ID = B.APPLY_IDAND A.FILE_TYPE = 220;

尽管要插入两条数据,但从脚本可以看出,主键是序列生成的。对于这样的主键策略,如果有主键冲突的话,通常是查询到序列后,在应用程序中做了处理,然后再插入数据库中可能会存在问题。
直接在数据库中进行insert应该是不会有这个问题的。

再进一步排查,发现在索引上除了主键索引的类型是Unique之外,还有一个索引也是Unique(这个时候才发现日志其实已经提示很明确了,unique constraint (EINSU_MAIN.UNI_EIS_EIS_INSU_APP_FILE__BUSI2)violated 我还自以为是的以为是主键冲突)在这里插入图片描述
以前我添加表约束中的唯一性约束都是通过类似下面这样的语句去添加,或者在建表的时候添加。

ALTER TABLE table ADD CONSTRAINT uq_col UNIQUE(col);

注:若唯一性约束涉及多列,则只能通过表级约束添加
经百度,才知道除了有唯一约束还有唯一索引
为对比二者的差别,做了一个简单的实验

CREATE TABLE TEMP001(SID NUMBER(8, 0),NAME VARCHAR2(10),SEX CHAR(2),BIRTHDAY DATE,EMAIL VARCHAR2(20),DEPID NUMBER(5, 0));ALTER TABLE TEMP001 ADD CONSTRAINT TEMP001_UQ UNIQUE(SID);
CREATE UNIQUE INDEX UNI_IDX_EMAIL ON TEMP001(EMAIL);

在这里插入图片描述
在这里插入图片描述
可以看出,建立唯一约束后默认会建立一个同名的唯一索引,也就是唯一约束实际是通过唯一索引实现的。
禁用唯一约束ALTER TABLE TEMP001 DISABLE CONSTRAINT TEMP001_UQ;后:在这里插入图片描述
在这里插入图片描述
可以看出禁用唯一约束后唯一索引被删除了。
其他在满足列值唯一的效果上没有什么区别


http://chatgpt.dhexx.cn/article/DmFpHQ2k.shtml

相关文章

违反唯一约束条件 ORA-00001

1.向用户表新增记录,报违反唯一约束条件 ORA-00001。 2.因为表里设置了自增长字段,当自增长字段的起始值小于现有记录的最大值,就会报错。 如表里有526条记录,自增长的值应该是从526以后的值开始,但是自增长的设置值却…

二叉树前序遍历、中序遍历、后序遍历、层序遍历的直观理解

0. 写在最前面 希望大家收藏: 本文持续更新地址:https://haoqchen.site/2018/05/23/go-through-binary-tree/ 复习到二叉树,看到网上诸多博客文章各种绕,记得头晕。个人觉得数学、算法这些东西都是可以更直观简洁地表示&#xf…

二叉树的前序遍历(递归)

遍历的作用: 它是树结构插入,删除,修改,查找和排序运算的前提,是二叉树一切运算的基础和核心。 遍历二叉树——从根结点触发,按照某种次序依次访问二叉树中所有结点,使得每个结点均被访问一次…

二叉树遍历应用之根据前序遍历建树

文章目录 题目描述题目分析及实现思路根据前序遍历序列建立二叉树 题目实现完整代码 题目描述 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串&#xff1a…

已知二叉树前序遍历是ADCEFGHB,中序遍历是CDFEGHAB,要求画出二叉树的结构或写出后序遍历

笔试特别喜欢考这种题。先说一下思路。 首先,需要明白前序、中序、后序遍历: ①前序:根→左→右 ②中序:左→根→右 ③后序:左→右→根仅明白这个是不行的,还需要技巧。对于标题中的问题, 我们…

二叉树遍历(前序遍历、中序遍历、后序遍历)

1.说明 前序遍历: 先输出父节点,再遍历左子树和右子树 中序遍历: 先遍历左子树,再输出父节点,再遍历右子树 后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点 小结: 看输出父节点的顺序,就确定是前序…

144. 二叉树的前序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3] 示例 2: 输入:root [] 输出:[] 示例 3: 输入:root [1] 输出&a…

二叉树的前序遍历(C++)

二叉树的前序遍历 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入: root [1,null,2,3] 输出: [1,2,3]示例 2: 输入: root [] 输出: []示例 3: 输入&…

二叉树的前序遍历(C语言)

我们从两个方向讲解二叉树的前序遍历(递归迭代) 一.递归 思想: 从根节点开始向其左孩子遍历每经过一个节点记录一下该节点的数值(只在第一次经过该节点时进行记录),当走到NULL时返回上一个节点,然后遍历其右孩子,如果右孩子存在记录其数值,再重复上面操作,如果不存在为NULL直…

二叉树前序遍历--递归

前序遍历的概念:遍历顺序-根左右,从根节点往下查找,先找左子树、直至左子树为空(左子节点逐个入栈、直至左子节点为空),再找右子树(出栈找右子节点)第一次经过节点即打印,直到打印null,往回溯,打…

二叉树前序遍历(递归以及非递归)

二叉树前序遍历 对于一种数据结构而言,我们最常见的就是遍历,那么关于二叉树我们该如何去遍历呢? 请看大屏幕 。。。。 上图是一棵二叉树,前序遍历结果:1 2 4 5 3 6 咦,我想你可能会疑惑什么叫做前序遍历…

二叉树前序遍历三种方式(c++ 实现)

一.递归 递归很简单,只要在调用子节点前对当前节点进行操作即可 struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptr) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, …

数据结构二叉树前序遍历递归和非递归算法

2022.11.19 二叉树前序遍历递归和非递归算法 任务描述相关知识编程要求测试说明C/C代码 任务描述 本关任务:给定一棵二叉树,使用递归和非递归的方法实现二叉树的先(前)序遍历结果。 相关知识 为了完成本关任务,你需…

二叉树前序遍历(递归法和迭代法(即非递归法))——C++

声明:本文原题主要来自力扣力扣,记录此博客主要是为自己学习总结,不做任何商业等活动 本文主要讲解二叉树的前序遍历递归法和迭代法。中序遍历和后序遍历可以参考博主下面两篇博客:二叉树中序遍历(递归法和迭代法(非递…

二叉树前序遍历-迭代

二叉树的前序遍历 对于一颗二叉树,当遍历它的时候使用 递归总是轻而易举的。这是二叉树前序遍历-使用递归 public void preorderTraversal(TreeNode root){if(rootnull)return;System.out.print(root.data" ");preorderTraversal(root.left);preorderT…

二叉树前序遍历执行过程

二叉树前序遍历执行过程 前序遍历:根-左-右 图示 记录与总结,2021年 11月 12日 星期五 11:35:14 CST。

二叉树的前序遍历

二叉树文章系列: 二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历二叉树的层序遍历二叉树的前序、中序、后序、层序遍历【解法完整版】 本文目录 一、解题思路:递归二、解题思路:迭代(方法1)三、解题思路&#xff…

二叉树的先序遍历

二叉树的概念 二叉树是一种特殊的树。二叉树的特点是每个节点最多有两个儿子,左边的叫左二子,右边的叫做右儿子,或者说每个结点最多有两棵子树,二叉树要么为空,要么由根节点、左子树和右子树组成,而左子树…

(数据结构)二叉树先序遍历

二叉树先序遍历 二叉树先序遍历的实现思想是: 访问根节点访问当前节点的左子树若当前节点无左子树,则访问当前节点的右子树 图 1 二叉树 以上图 1 为例,先序遍历的过程如下: 访问该二叉树的根节点,找到 1访问节点 1 …

【SpringBoot高级篇】SpringBoot集成Elasticsearch搜索引擎

【SpringBoot高级篇】SpringBoot集成Elasticsearch搜索引擎 1. 什么是Elasticsearch?2. 安装并运行Elasticsearch2.1 拉取镜像2.2 启动镜像 3. 安装kibana3.1 拉取kibana镜像3.2 启动kibana镜像 4. Elasticsearch基本概念索引(Index)文档(Do…