oracle 问题ORA-00001:唯一的约束违反进来的更新/更新

hujrc8aj  于 2023-10-16  发布在  Oracle
关注(0)|答案(7)|浏览(167)

我试图在表中插入一些值,然后应用程序并获得问题ORA-00001:违反了唯一约束。我看到序列与表的最高id不同步,但即使修复了序列号,错误仍然存在。我怎样才能调试这个错误更多,oracle日志给予更多的错误?如何查看Oracle日志?谢谢Priyank
update:我们使用审计日志插件,在User的域类中,我们捕获保存事件并将条目记录到审计日志中
在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"不知道如何解决这个问题。谢谢

3lxsmp7m

3lxsmp7m1#

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

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

hjqgdpho

hjqgdpho2#

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

ORA-00001: unique constraint (constraint_name) violated

这是由于尝试执行INSERTUPDATE语句时,在受唯一索引限制的字段中创建了重复值。
您可以通过以下方式解决此问题

  • 更改约束以允许重复项,或
  • 删除unique约束,或者更改SQL以避免重复插入
1rhkuytd

1rhkuytd3#

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

ORA-00001: unique constraint (TABLE_UK1) violated

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

laawzig2

laawzig24#

错误消息如下所示

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;

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

kokeuurv

kokeuurv5#

检查数据库中可能导致该特定表出现问题的序列。我改变了导致错误的表的序列,它工作了。

fzwojiic

fzwojiic6#

我有同样的问题,当我试图插入数据合并,更新,插入。
我修复了这个问题使用修剪比较。
无法工作的代码:

...on (c.CHAR_TYPE_CD = n.CHAR_TYPE_CD and c.CHAR_VAL = n.CHAR_VAL and c.LANGUAGE_CD = n.LANGUAGE_CD)

成功的替代方案:

...on (trim (c.CHAR_TYPE_CD) = n.CHAR_TYPE_CD and trim (c.CHAR_VAL) = n.CHAR_VAL and trim (c.LANGUAGE_CD) = n.LANGUAGE_CD)
uqcuzwp8

uqcuzwp87#

选择索引,然后选择所需的,然后选择SQL,然后单击操作,然后单击重建

相关问题