我有一个数据库表,其中定义了唯一键约束,以避免重复记录的发生。
我很好奇,如果在表格上运行INSERT语句之前不手动检查重复记录是不好的做法。
换句话说,我应该使用WHERE子句运行SELECT语句,该子句检查我将要INSERT的记录的重复值。如果找到记录,则不要运行INSERT语句,否则继续运行INSERT ....
OR
只需运行INSERT语句并尝试/捕获由于唯一键违规而可能引发的异常。
我正在权衡这两种观点,无法决定哪种观点最好 - 1.当我可以捕获异常VS时,不要浪费SELECT调用来检查重复项 2.不要因为实现丑陋的try / catch逻辑而变得懒惰 VS 你的想法在这里? :)
答案 0 :(得分:8)
你真的必须使用try..catch方法。它可能不太优雅,但它是万无一失的。
如果有多个客户更新此表,则另一个客户可能会在您的支票和您的插页之间插入一条记录。您仍然可以检查是否需要,以节省尝试不必要地插入。如果您担心的话,这可能是一个小的性能提升,但前提是 重复。但是每当不是重复时,你就会通过同时执行SELECT和INSERT来支付性能损失。
无论如何,违反约束的几率是多少?可能很小,为什么还要打扰检查呢?
答案 1 :(得分:4)
即使您检查重复项,也可以在检查之后和插入之前插入新项目,因此仍需要try / catch块。
答案 2 :(得分:4)
Try / catch更安全,更具可伸缩性,因为您只需触摸一次表。 try / catch删除了早期版本中的坦率错误处理