我试图通过应用程序在表中插入一些值并得到问题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"
不知道如何解决这个问题..
感谢
答案 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>>
一旦您知道哪些列受到影响,您就可以将您尝试INSERT
或UPDATE
的数据与表中已有的数据进行比较,以确定违反约束的原因
答案 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)