我使用 JDBC(mysql 数据库)编写 Java 程序。 当我违反 mysql 完整性时(例如,我尝试插入相同的主键值),我捕获了 SQL 异常。 我应该以它可能永远不会发生的方式编写它(例如,首先检查主键值是否不在数据库中然后调用插入的 boolean 函数),或者是否可以通过异常处理它? 示例:
catch (SQLException ex) {ex.printStackTrace(); showSomeErrorDialog(); }
最佳答案
确实基本上有两种方法可以实现这一点:
插入前测试记录是否存在——在同一事务内。
判断是否
SQLException#getSQLState()
捕获的SQLException
以23
开头,这是根据 SQL specification 的约束违规.也就是说,它可能是由更多因素引起的,而不仅仅是“仅仅”违反约束。您不应将每个SQLException
都修改为约束违规。public static boolean isConstraintViolation(SQLException e) { return e.getSQLState().startsWith("23"); }
我会选择第一个,因为它在语义上更正确。事实上,这并非特殊情况。您即知道它可能会发生。但它可能会在事务不同步(不知不觉或优化性能)的重并发环境中失败。然后您可能想要确定异常。
也就是说,您通常不应该违反主键 的约束。在使用技术键作为主键的设计良好的数据模型中,它们通常由数据库本身管理。该字段不应该是一个唯一键吗?
关于Java + MySQL 完整性违规处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2201119/