我正在使用 JDBC 将数据持久化到 SQL Server,并希望在表中插入一个新行,该表具有一个主键、多个外键和多个列上的多个唯一性约束。我想知道如何处理约束违规,以便我可以确定需要更正哪些字段(以便向用户报告有意义的内容)。
例如:
表测试:id (PRIMARY), fk_id (FOREIGN KEY), field1 (UNIQUE), field2 (UNIQUE)
在 field1 OR field2 中插入重复值会给出:
ErrorCode: 2627
SQLState: 23000
Violation of UNIQUE KEY constraint '<UNIQUE CONSTRAINT NAME>'. Cannot insert duplicate key in object 'dbo.test'. The duplicate key value is (<VALUE>).
但是,这不足以确定哪个字段导致了异常(所以我可以告诉用户,正确的字段 1 或字段 2),缺少解析错误消息并使用约束名称(感觉不对,看起来像脆性溶液)。
我能想到的另一种方法是不依赖异常,而是查询具有相同值的任何现有行(在插入之前手动检查唯一性)。但是,这可能需要在可序列化事务中进行许多查询(减少并发性)。更糟糕的是,如果时间不幸与另一个事务冲突,该事务可能会死锁和回滚。
有没有更好的方法来实现我想要做的事情而不必解析(特定于语言环境的)异常消息?什么是“最佳实践”方式?