2

我在表中有一个具有唯一约束的列。

现在一般来说,如果该列的值是否重复,最好检查数据库,或者处理它在 try catch 中产生的异常是否更好?

答案会是一般性的,还是会有这样的情况,例如它只是一个简单的表,例如用户名列,或者表有很多列和外键。

编辑:

在阅读了两个答案之后,我认为这件事是有争议的,因为它可能会导致预检查数据库的性能问题或捕获异常时的代码问题,但我认为我更喜欢捕获异常,特别是如果唯一值需要更新。

4

2 回答 2

5

要在尝试插入之前检查数据库,您要么最终引入竞争条件,要么取出键范围锁(这可能导致阻塞等)。无论哪种情况,当您实际插入时,无论如何都必须检查重复项,因此您纯粹是在添加工作(并且可能是额外的往返行程)。

它确实有点取决于它是重复的可能性,但在大多数情况下:这是异常的,并且可能应该这样处理 - 当数据库报告问题时通过异常处理。但是:总会有一些情况下,提前检查是明智的——在这些情况下,你可能会同时做这两个。例如,在一个数据输入应用程序中,只要用户在此处的键输入中输入一个值,然后跳到下一个控件 - 您可能会在后台检查数据库以验证是否还没有值:但是- 您仍然需要为来自多个来源的数据不断变化的事实做好准备 - 所以无论您如何检查,在您插入时它仍然可能是重复的。

于 2013-10-31T10:03:42.920 回答
1

我通常在异常发生之前添加验证/检查,这种方式可以帮助我计划在验证失败时我应该做什么。尽管约束可能会做同样的事情,但我相信抛出异常是昂贵的,因为它会创建额外的对象。但总的来说,最好进行多项检查——验证、约束等。这样你就可以确保数据的完整性。

于 2013-10-31T10:21:38.033 回答