【问题标题】:Unique column constraint, Exception vs Database Check?唯一列约束,异常与数据库检查?
【发布时间】:2013-11-11 06:15:19
【问题描述】:
我在表中有一个具有唯一约束的列。
现在一般来说,如果该列的值是否重复,最好检查数据库,还是最好处理它在 try catch 中产生的异常?
答案是一般性的,还是会出现这样的情况,例如它只是一个简单的表,例如用户名列,或者表有很多列和外键。
编辑:
在阅读了两个答案后,我认为这件事是有争议的,因为它可能会导致预检查数据库的性能问题或捕获异常时的代码问题,但我认为我更喜欢捕获异常,特别是如果唯一值需要更新.
【问题讨论】:
标签:
c#
sql-server-2008
exception
try-catch
unique-constraint
【解决方案1】:
要在尝试插入之前检查数据库,您要么最终引入竞争条件,要么取出键范围锁(这可能导致阻塞等)。在任何一种情况下,当您实际插入时,它都必须检查重复的无论如何,因此您纯粹是在 添加 工作(并且可能是额外的往返行程)。
它确实取决于一个 bit 它是重复的可能性,但在大多数情况下:这是异常的,并且可能应该这样处理 - 通过数据库时的异常报告一个问题。但是:总会有一些情况下,提前检查是明智的——在这些情况下,你可能会同时做这两个。例如,在一个数据输入应用程序中,只要用户在此处的键输入中输入一个值,然后跳到下一个控件,您就可以在后台检查数据库以验证那里还不是一个值:但是 - 您仍然需要为来自多个来源的数据不断变化这一事实做好准备 - 所以 无论您如何检查,它仍然可以在插入时重复。
【解决方案2】:
我通常在异常发生之前添加验证/检查,这样可以帮助我计划在验证失败时我应该做什么。尽管约束可能会做同样的事情,但我相信抛出异常是昂贵的,因为它会创建额外的对象。但总的来说,最好进行多项检查 - 验证、约束等。这样您就可以确保数据的完整性。