【问题标题】:issue ORA-00001: unique constraint violated coming in INSERT/UPDATE问题 ORA-00001:插入/更新中违反了唯一约束
【发布时间】:2012-03-30 04:06:49
【问题描述】:

我试图通过应用程序在表中插入一些值并得到问题 ORA-00001:违反唯一约束。 我看到序列与表的最高 id 不同步,但即使在修复序列号之后,错误仍然存​​在。 我怎样才能更多地调试这个错误,oracle日志会给出更多错误吗?如何查看 oracle 日志? 谢谢 普里扬克

更新:我们正在使用审计日志插件,在用户的域类中,我们捕获保存事件并将条目记录到审计日志中

所以在 User 类中我们这样做:

class User {

//some attributes, constraints, mappings

def onSave = {
 Graaudit aInstance = new Graaudit();
         aInstance.eventType= "GRA User Create"
         aInstance.eventDescription = "GRA User Created"
         aInstance.objectid = username
         aInstance.objecttype = 'GRAUSER'
         aInstance.user_id = RequestContextHolder.currentRequestAttributes().session.username

          aInstance.withTransaction{
              aInstance.save()
          }
    }

}

当我们在 onSave 事件中没有上述代码时,用户被成功创建。
我假设它与我们在实例上使用的休眠事务有关,那是死亡或当前事务由于该保存而死亡.
如果我们不使用事务我们会得到一个异常"org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here" 不知道如何解决这个问题.. 谢谢

【问题讨论】:

  • 序列是唯一的约束,还是有其他约束?

标签: oracle hibernate transactions


【解决方案1】:

错误消息将包含被违反的约束的名称(表上可能有多个唯一约束)。您可以使用该约束名称来标识声明唯一约束的列

SELECT column_name, position
  FROM all_cons_columns
 WHERE constraint_name = <<name of constraint from the error message>>
   AND owner           = <<owner of the table>>
   AND table_name      = <<name of the table>>

一旦您知道哪些列受到影响,您就可以将您尝试使用的数据与INSERTUPDATE 与表中已有的数据进行比较,以确定违反约束的原因。

【讨论】:

  • 或者,您可以使用以下查询:SELECT * FROM ALL_CONS_COLUMNS A JOIN ALL_CONSTRAINTS C ON A.CONSTRAINT_NAME = C.CONSTRAINT_NAME WHERE C.CONSTRAINT_NAME LIKE '%SYS_C0010988%';。只需将末尾的 CONSTRAINT_NAME: SYS_C0010988 替换为错误消息中的那个即可。
【解决方案2】:

由于违反唯一性约束而发生此 ORA 错误。

ORA-00001: unique constraint (constraint_name) violated

这是因为试图执行 INSERTUPDATE 语句,该语句在受唯一索引限制的字段中创建了重复值。

你可以通过

解决这个问题
  • 更改约束以允许重复,或
  • 删除唯一约束,或者您可以更改 SQL 以避免重复插入

【讨论】:

  • 拯救了这一天!删除现有行
  • 在我的情况下,除了主键列之外,其中一个列上应用了唯一索引。当我更改该列的值时,错误解决了。因此,不要认为您的 pk 列是唯一的,还要检查应用了唯一索引的其他列。
【解决方案3】:

Oracle 的错误消息应该更长一些。它通常看起来像这样:

ORA-00001: unique constraint (TABLE_UK1) violated

括号中的名称是约束名称。它会告诉您违反了哪个约束。

【讨论】:

  • 如果它只是一个圆括号中没有名字的点怎么办?例如:ORA-00001:违反了唯一约束 (.)
【解决方案4】:

错误信息如下所示

Error message => ORA-00001: unique constraint (schema.unique_constraint_name) violated

ORA-00001 在以下情况下发生:“查询尝试在表中插入“重复”行”。它使唯一约束失败,因此查询失败并且未将行添加到表中。”

解决方案:

查找unique_constraint中使用的所有列,例如a列,b列,c列,d列共同创建unique_constraint,然后使用以下查询从源数据中找到重复的记录:

-- to find <<owner of the table>> and <<name of the table>> for unique_constraint

select *
from DBA_CONSTRAINTS
where CONSTRAINT_NAME = '<unique_constraint_name>';

然后使用 Justin Cave 的查询(粘贴在下面)查找 unique_constraint 中使用的所有列:

  SELECT column_name, position
  FROM all_cons_columns
  WHERE constraint_name = <<name of constraint from the error message>>
   AND owner           = <<owner of the table>>
   AND table_name      = <<name of the table>>

    -- to find duplicates

    select column a, column b, column c, column d
    from table
    group by column a, column b, column c, column d
    having count (<any one column used in constraint > ) > 1;

您可以从源数据中删除该重复记录(在我的特定情况下这是一个选择查询,正如我在“插入选择”中所经历的那样)或修改以使其唯一或更改约束。

【讨论】:

    【解决方案5】:

    选择 索引然后选择需要的然后选择 sql 并单击操作然后单击重建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多