【问题标题】:oracle sequence getting messed up , and inserts failing due to that?oracle 序列变得混乱,因此插入失败?
【发布时间】:2012-03-14 01:14:36
【问题描述】:

我正在使用序列将域对象实例保存在我的 oracle 数据库中。 我对数据库中的每个表都有一个序列。 例如,当我在用户或资源上使用保存功能时,它在第一次尝试时创建了一个新资源,但使用的 ID 是 70?该序列显示了正确的下一个数字 - 42,因为表中的最大 id 为 41。为什么使用 id=70 来插入新资源?

同样从下一次尝试所有插入都失败并出现此错误

org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; SQL [insert into GRARESOURCE (decomm
issioned, disabled, criticality, resourceClass, resourceGroupId, resourceName, ownerId, resourceSegmentId, resourceTypeId, riskSco
re, targetIP, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; constraint [GRA.SYS_C0012183]; nested exception is org.hibernate.e
xception.ConstraintViolationException: Could not execute JDBC batch update

不确定出了什么问题,因为这是在代码重组之后发生的……我们将代码移到了新包中……

编辑:我找到了原因,请参阅我的回复..谢谢大家

【问题讨论】:

  • 在这一行展开,“序列显示正确的下一个数字 - 42,因为表中的最大 id 为 41。”是什么让你这么说?
  • 请在下面查看我的回复。谢谢

标签: oracle sequences ora-00001


【解决方案1】:

序列可能会浪费数字,即表中的每条记录不一定是一个接一个,没有间隙。换句话说,即使之前的 DB 记录的 ID=41,您的数据也跃升至 70,这并不表示存在问题。

【讨论】:

    【解决方案2】:

    因为表中的最大 id 是 41

    序列看不到表的最大值并得到下一个。它们存储当前序列号,您将使用下一个值。

    您可以通过以下方式查看实际数字:

    select mysequence.currval from dual
    

    您的问题在于 GRA.SYS_C0012183 约束。看看这个检查什么,如果这是你的主键,也许你可以使用一些更易读的名字,比如 MY_TABLE_PK...

    【讨论】:

      【解决方案3】:

      SYS_C0012183 是主键约束吗?它是否不仅定义了 id 列(我假设它是由序列填充的列)?

      • 如何确定序列的下一个值是 42?您是否为此运行单独的查询?
      • 您是否希望序列为您提供无间隙的数字?如果是这样,那就是您的期望有问题。序列返回不同的值,但它们不保证不会有间隙(事实上,您可以保证会有间隙,因为数据库关闭或序列从共享池中清除或事务回滚)。
      • 如何使用序列?桌子上有触发器吗?还是 Hibernate 配置为使用该序列?如果 Hibernate 配置为使用该序列,请发布该配置。

      【讨论】:

        【解决方案4】:

        我意识到问题的主要原因。 我以前使用过 SequencePerTableOracleDialect,这是从 Burt Beckwith 之前的一篇文章中得到的。该方言在应用程序启动时为每个表创建一个新序列,类似于域类转换为表。 该方言还确保每个表的 id 序列仅通过其序列进行管理,并且不会将公共序列用于数据库中的所有插入(这是默认策略) 在代码重组期间,我删除了自定义方言并使用默认的 10g 方言。

        这就是导致问题的原因!

        我在关联序列的下一个值字段的表中看到下一个数字,我知道资源表中的下一个 val =42 是正确的,因为资源表中的 max(id) 是 41。

        非常感谢大家的洞察力,这在某种程度上帮助我回忆起真正的原因! 对于那些需要了解更多关于自定义方言的人, 它的Here

        【讨论】:

          猜你喜欢
          • 2018-05-05
          • 1970-01-01
          • 1970-01-01
          • 2020-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-31
          相关资源
          最近更新 更多