当前位置: 首页 > 知识库问答 >
问题:

行不存在时引发异常的Oracle唯一约束

胡飞舟
2023-03-14

我在oracle数据库中有一个表,我们称之为Task,我要在其中插入批处理过程中的一堆行。

我在4列上设置了唯一的约束,其中一列是可为null的(locationId、shelfId、itemId和batchId),其中一列是可为null的(shelfId)

在解析CSV文件的值(从另一个数据库表读取)的过程中,这些值以100为一组进行批处理,并发布到一个API以便进一步解析(以上面提到的表的格式),然后插入以便稍后提交到另一个表(在不同的模式中,但具有相同的唯一约束)。我遇到的问题是文件中存在基于上述约束的重复项(它们通常是连续的,我只在文件中看到过一个附加项)。在它们被解析之后,它们被插入,并且我看到唯一约束异常被抛出在a)表中没有行并且b)不满足唯一约束的行上。当我从初始导入文件中移除重复项时,我没有得到任何唯一约束异常(这...有足够奇怪的意义)。

我将.NET中的实体框架用于Oracle数据库,我不认为这与此有任何关系,但从这个问题的怪异程度来看,它可能会。我完全不知道该怎么做,我试过在插入记录之前编写额外的验证并查找表中的记录,将它们从初始文件中删除(这是一种工作),但我不确定该怎么做才能获得长期的解决方案。

示例数据:

LocationId ShelfId ItemID  BatchId 
1          NULL    00AXXFD 1 
1          NULL    00AXXFD 1 
1          NULL    00FFD12 1 
etc... 

共有1个答案

鄢修德
2023-03-14

由于输入数据包含重复项,您将出现UK错误。当您同时插入所有这些事务时,它们是同一事务的一部分,因此Oracle甚至在提交之前就会看到重复项并抛出异常。失败后,事务回滚,因此您看不到插入的任何记录,因此没有找到重复的记录。

正确的方法是在插入之前从输入数据中删除重复项(就像您正在做的那样)。您可以使用Oracle通过在插入每一行后提交来强制UK。

注意-正如我所说的,在插入每一行之后,您可能不会提交。插入是一个一个发生还是一次全部发生都不重要,重要的是事务范围。JDBC使用autocommit=true/false来启用单个操作提交。当它为“true”时,在每次操作之后都会提交一个事务。一般情况下,它需要为“false”,以便您可以控制事务范围

 类似资料:
  • 主要内容:Oracle唯一约束语法,Oracle唯一约束例子在本教程中,您将学习如何使用Oracle唯一约束来确保包含在一列或几列中的数据在表中的行之间是唯一的。 Oracle唯一约束语法 一个唯一的约束是一个完整性约束,它确保存储在一列或一组列中的数据在表中的行之间是唯一的。 通常,在使用内联约束语法创建表时,将唯一约束应用于列,如下所示: 此唯一约束指定中的值在整个表中是唯一的。也可以使用外线()约束语法来定义一个唯一的约束: 可以通过使用子句和约束名

  • 以下两者之间有区别吗: 以及: 在这两种情况下,名称是否唯一?索引唯一时意味着什么? 编辑:Postgres是唯一的约束,而索引没有回答我的问题。它考虑了FK的情况。我的问题与FK无关。我只想知道在这个例子中,这两个操作是否等价,其中不涉及FK。

  • 问题内容: 我有以下独特的约束 我正在尝试防止两个问题处于活动状态时具有相同的问题编号(IS_ACTIVE值= 1)。 一切似乎都很好,直到我第二次不得不提一个问题。 我需要仅在IS_ACTIVE = 1时应用约束 问题答案: 您可以创建一个基于函数的唯一索引 这利用了以下事实:Oracle b树索引不存储数据,而叶块数据将完全为NULL。

  • 我目前正在使用Spring Boot1.4.2,我在其中加入了Spring-boot-starter-web和spring-boot-starter-jpa。 我的主要问题是,当我保存一个新的实体时,它工作得很好(一切都很酷)。 但是,如果我用相同的id保存一个新的产品实体(例如重复的条目),它不会抛出异常。我期待的是ConstrintViolationException或类似的东西。 考虑到以下

  • 你可以使用raise语句 引发 异常。你还得指明错误/异常的名称和伴随异常 触发的 异常对象。你可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接导出类。 如何引发异常 例13.2 如何引发异常 #!/usr/bin/python # Filename: raising.py classShortInputException(Exception):     '''A u

  • 我已经创建了一个解码器来处理客户端发送的字节。给你 并在客户端发送字节时抛出下一个错误 Io.netty.handler.codec.DecoderException:java.lang.IllegalArgumentException:MinimumReadableBytes:-603652096(预期:>=0)在io.netty.handler.codec.ReplayingDecoder.C