如何区分java中的PrimaryKey和uniquekey约束

时间:2017-02-02 20:14:09

标签: java sql oracle

在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

3 个答案:

答案 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)

根据名称(PKUK),您能找到有关该名称的元数据吗?

例如,Oracle具有ALL_CONSTRAINTSALL_INDEXES表。 ALL_CONSTRAINTS有一个constraint_type列,其中P =主键。 ALL_INDEXES的{​​{1}}列的值为UNIQUE或NONUNIQUE。

希望您的数据库有类似的东西。