2010-03-27 66 views
8

我有一个数据库表,有一个唯一键约束定义,以避免重复的记录发生。检查重复记录VS尝试/捕获唯一密钥约束

我很好奇,如果是在执行INSERT语句之前手动检查重复记录是不好的做法。

换句话说,我是否应该使用WHERE子句运行SELECT语句来检查我将要执行INSERT的记录的重复值。如果找到了记录,然后不要运行的INSERT语句,否则继续运行的INSERT ....

OR

只要运行INSERT语句和try/catch可能由于被抛出的异常到唯一的密钥违规。

我正在权衡两个观点,不能决定哪个是最好的 - 1.不要浪费SELECT电话来检查是否有重复,因为我只能捕获异常VS 2.不要懒惰通过实施丑陋的尝试/捕捉逻辑 VS 3.你的想法在这里? :)

回答

7

您确实必须使用try..catch方法。它可能不太优雅,但它是万无一失的。

如果有多个客户端更新此表,则另一个客户端可能会在您的支票和插入之间插入一条记录。你仍然可以检查你是否想要,以节省试图不必要的插入。这可能是一个小的性能增加,如果这就是你担心的,但只有当重复。但是每次出现都不是一个重复项,您已经通过同时执行SELECT和INSERT来支付性能损失。

无论如何,会有违反约束的可能性是多少?可能很小,那么为什么还要支票?

3

即使您检查重复项,您可以在插入之后插入新项目,以便仍需要尝试/ catch块。

3

Try/catch更安全,更具可扩展性,因为您只需触碰表格一次。 在try/catch语句去掉了此前版本中坦言不稳定的错误处理

lesson 4 from this article