防止数据库中重复值的最佳方法是什么

时间:2015-04-11 12:16:34

标签: mysql sql database oracle

防止数据库中重复值的最佳方法是什么?

我有一个名为names的表,只有一个名为name的列是唯一的(声明为唯一属性)。

插入新名称(x)的最佳方式是什么?

方式1:我应该首先对名称x进行选择查询以检查是否存在。然后进行另一个查询以插入名称,如果它不存在于表中。

Way2:只有一个查询插入名称,如果名称已经存在则忽略错误。

4 个答案:

答案 0 :(得分:3)

第二种方式是更好的方式。为什么在运行一个查询时运行两个查询?

当您将列声明为唯一时,您已告知数据库执行额外的工作以确保这是真的。您不需要做任何其他事情 - 除了检查返回时的错误。

答案 1 :(得分:0)

  • 第一种方式有效。在操作之后,您可以确保记录存在(除非发生其他一些错误)您确实需要第二个查询(或其他一些机制)来检索实际的元组,无论是现有元组还是刚插入的元组。
  • 第二种方式很糟糕:DBMS会话处于错误状态,{您当前的工作已被隐含地回滚,并且您的所有游标都已关闭}所以,您必须启动再次工作,希望没有重复。

答案 2 :(得分:0)

数据库约束肯定会关注唯一性,但是如果你有逻辑,你需要将最后插入的ID用于其他子表,那么我认为你只需要在插入之前执行手动检查,否则只需要忽略异常由于重复。

答案 3 :(得分:0)

您提供的案例是简化的“upsert”。搜索upsert,你会找到更一般的问题的答案。一些数据库,如mysql提供 插入忽略这个简单的情况。 否则,对于您提到的简单情况,您可以使用第二种方法。对于更普遍的upsert,令人惊讶地难以做到正确。问题是并发更新。事实上,我没有看到一般的upserts令人满意的答案。有人说使用“merge”但这会受到并发问题的影响。