检查重复记录 VS 尝试/捕获唯一键约束

Posted

技术标签:

【中文标题】检查重复记录 VS 尝试/捕获唯一键约束【英文标题】:Check For Duplicate Records VS try/catch Unique Key Constraint 【发布时间】:2010-03-27 18:56:09 【问题描述】:

我有一个数据库表,它定义了一个唯一键约束以避免重复记录的发生。

我很好奇在对表运行 INSERT 语句之前不手动检查重复记录是否是不好的做法。

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

只需运行 INSERT 语句并尝试/捕获可能因违反唯一键而引发的异常。

我正在权衡这两种观点,无法决定哪个是最好的—— 1. 当我可以捕获异常时,不要浪费 SELECT 调用来检查重复项 VS 2. 不要通过实现丑陋的 try/catch 逻辑来偷懒 VS 3. ???你的想法在这里??? :)

【问题讨论】:

【参考方案1】:

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

如果有多个客户端更新此表,则另一个客户端可能会在您的支票和插入之间插入一条记录。您仍然可以检查是否愿意,以免不必要地尝试进行插入。如果这就是您所担心的,那么这可能是一个小的性能提升,但前提是存在 重复项。但是每次没有重复时,您都通过执行 SELECT 和 INSERT 来支付性能损失。

无论如何,违反约束的可能性有多大?可能很小,那为什么还要麻烦检查呢?

【讨论】:

【参考方案2】:

Try/catch 更安全,更可扩展,因为您只需触摸一次桌面。 try/catch 消除了早期版本中坦率地不稳定的错误处理

也见lesson 4 from this article

【讨论】:

【参考方案3】:

即使您检查重复项,也可以在检查之后和插入之前插入新项目,因此您仍然需要 try/catch 块。

【讨论】:

以上是关于检查重复记录 VS 尝试/捕获唯一键约束的主要内容,如果未能解决你的问题,请参考以下文章

删除重复的 SQL 记录以允许唯一键

如何在 SQLiteConstraintException 上捕获列名唯一约束失败

SQL约束

Django 导入 - 导出:尝试在具有唯一性或唯一性约束的字段中插入重复记录时出现 IntegrittyError

SQL有三个类型的索引,唯一索引 不能有重复,但聚集索引,非聚集索引可以有重复

SQL唯一性约束的作用是啥?