在PrimaryKey违规和uniqueKey违规的两种情况下,我都看到相同的消息,错误代码和sql状态值。
当我直接在db中运行insert查询时,为这两种情况获取相同的错误消息。唯一的区别是约束名称。我们不能一直依赖约束名。如何区分不同类型的SQL约束违规?
try {
// create Db connection & sql insert into table statement
// stmt.executeUpdate("insert into mytable (A,B) .......")
// mytable has primary key on column A and unique key on column B
}catch(Exception e){
System.out.println(">>>>>>>>>> get Message :: " + e.getMessage());
System.out.println(">>>>>>>>>> get err code:: " + ((SQLException)e).getErrorCode());
System.out.println(">>>>>>>>>> get sql state:: " + ((SQLException)e).getSQLState());
}
测试1:
>>>>>>>>>> get Message :: ORA-00001: unique constraint (TABLE_NAME.UK) violated
>>>>>>>>>> get err code:: 1
>>>>>>>>>> get sql state:: 23000
测试2:
>>>>>>>>>> get Message :: ORA-00001: unique constraint (TABLE_NAME.PK) violated
>>>>>>>>>> get err code:: 1
>>>>>>>>>> get sql state:: 23000
答案 0 :(得分:1)
我们不能一直依赖约束名称
为什么?
约束名称必须是唯一的
因此,为了通过编程方式区分SQLException与另一个约束违规,两者都是相同的约束类型,因此具有相同的错误代码,您可以检查约束名称。
如果您不想使用这种方式,则必须手动检查要插入的数据是否违反了表上设置的约束。
这也是一种处理方式,但在插入之前系统地执行检查会更加昂贵。
答案 1 :(得分:1)
如果您知道约束名称和架构所有者,则可以从all_constraints表中查找约束类型。
例如:
select constraint_type from all constraints where owner='<your schema owner>'
and constraint_name = '<constraint name returned in your error>'
在此处查看各种约束类型代码 - https://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_1037.htm#i1576022
答案 2 :(得分:0)
根据名称(PK
或UK
),您能找到有关该名称的元数据吗?
例如,Oracle具有ALL_CONSTRAINTS
和ALL_INDEXES
表。 ALL_CONSTRAINTS
有一个constraint_type
列,其中P =主键。 ALL_INDEXES
的{{1}}列的值为UNIQUE或NONUNIQUE。
希望您的数据库有类似的东西。