Java + MySQL 完整性违规处理

标签 java jdbc integrity

我使用 JDBC(mysql 数据库)编写 Java 程序。 当我违反 mysql 完整性时(例如,我尝试插入相同的主键值),我捕获了 SQL 异常。 我应该以它可能永远不会发生的方式编写它(例如,首先检查主键值是否不在数据库中然后调用插入的 boolean 函数),或者是否可以通过异常处理它? 示例:

catch (SQLException ex) {ex.printStackTrace(); showSomeErrorDialog(); }

最佳答案

确实基本上有两种方法可以实现这一点:

  1. 插入前测试记录是否存在——在同一事务内。

  2. 判断是否SQLException#getSQLState()捕获的 SQLException23 开头,这是根据 SQL specification 的约束违规.也就是说,它可能是由更多因素引起的,而不仅仅是“仅仅”违反约束。您不应将每个 SQLException 都修改为约束违规。

    public static boolean isConstraintViolation(SQLException e) {
        return e.getSQLState().startsWith("23");
    }
    

我会选择第一个,因为它在语义上更正确。事实上,这并非特殊情况。您即知道它可能会发生。但它可能会在事务不同步(不知不觉或优化性能)的重并发环境中失败。然后您可能想要确定异常。

也就是说,您通常不应该违反主键 的约束。在使用技术键作为主键的设计良好的数据模型中,它们通常由数据库本身管理。该字段不应该是一个唯一键吗?

关于Java + MySQL 完整性违规处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2201119/

相关文章:

c++ - Green Hills Integrity 动态内存分配

mysql - Innobyte插件问题: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row

javascript - 使用javascript和jsp将数据插入融合图表

java - rs.last() 给出 Invalid operation for forward only resultset : last

java - 如何使用 Java 将 "2012-03-04 00:00:00.0"转换为格式为 "dd-mm-yyyy HH:mm:ss"的日期

sql - 有什么办法可以比较两个 sql 字符串来检查它们在语义上是否相同?

integrity - 无法在循环关系上强制引用完整性

java - readobject 方法抛出 ClassNotFoundException

java - 使用索引号一次性对多个数组进行排序?

java - 在匿名类中限定此名称与简单名称