问题ORA-00001:INSERT / UPDATE中违反了唯一约束

时间:2012-03-13 17:55:14

标签: oracle hibernate transactions

我试图通过应用程序在表中插入一些值并得到问题ORA-00001:违反了唯一约束。 我看到序列与表的最高id不同步,但即使修复了序列号,错误仍然存​​在。 如何更多地调试此错误,oracle日志是否会产生更多错误?我怎么能看到oracle日志? 谢谢 Priyank

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

所以在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事件中没有上述代码时,用户是成功创建的。
我假设它与我们在aInstance上使用的hibernate事务有关,那就是死亡或当前事务因此死亡保存。
如果我们不使用该交易,我们会收到例外"org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here" 不知道如何解决这个问题.. 感谢

5 个答案:

答案 0 :(得分:11)

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

上声明唯一约束的列
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的数据与表中已有的数据进行比较,以确定违反约束的原因

答案 1 :(得分:4)

由于违反了唯一约束,发生了此ORA错误。

ORA-00001:违反了唯一约束(constraint_name)

这是因为尝试执行INSERT或UPDATE语句,该语句在由唯一索引限制的字段中创建了重复值。

您可以通过更改约束以允许重复或删除唯一约束来解决此问题,也可以更改SQL以避免重复插入。

答案 2 :(得分:3)

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

ORA-00001: unique constraint (TABLE_UK1) violated

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

答案 3 :(得分:0)

错误消息看起来像这样

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;

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

答案 4 :(得分:-2)

选择 索引,然后选择所需的索引,然后选择sql并单击“操作”,然后单击“重建”

enter image description here