【问题标题】:Is it OK to use exceptions to mark when a duplicate SQL insertion is attempted?尝试重复 SQL 插入时可以使用异常进行标记吗?
【发布时间】:2018-12-14 22:55:17
【问题描述】:

场景

我有一个数据库,其中包含两个名称不同的 EQUAL 表(我们称它们为 Table1 和 Table2)。 Table1 通过 C# 程序定期向 Table2 发送一堆数据。 其中一些数据已经在 Table2 中,因此在 cmd 上会弹出一个简单的异常,然后程序继续运行。我不想要重复的数据,所以这很好,程序完全按照我想要的方式运行。

我的问题

我想知道 C# 查询函数是否可以像在这种情况下那样管理如此多的异常(20% 的插入是重复的并指向异常)。因为尽管程序可以运行,但该功能可能对程序本身效率低下或“有害”(以某种未知方式,例如导致更多延迟)。

如果是这样,我如何通过简单的“INSERT INTO”查询来解决这个问题? 是否有任何命令可以使它成为“执行此操作的好方法”?

【问题讨论】:

  • 你需要寻找 MERGE 命令。您可以决定遇到重复时该怎么做,如果不存在则插入(删除/更新可以存根)。
  • @eocron 我很确定这是防止它的最佳选择。但是存根似乎有点生锈,不是吗?应该存在对重复项不执行任何操作的选项。如果没有,请发布您的答案
  • MySQL 不支持 MERGE @eocron
  • 我想知道为什么当列相同时你需要两个表..
  • 是的,我知道INSERT INTO ... ON DUPLICATE KEY UPDATE ... @T.S.只是告诉 MySQL 不支持 MERGE 的未来读者可能会阅读 MERGE 并可能认为他们可以在 MySQL 中使用它。

标签: c# mysql sql


【解决方案1】:

由于您在 MySql 中,您可以使用此语法使所有语句完整且没有错误

INSERT INTO T1 (a, b)
    SELECT a, b FROM T2
ON DUPLICATE KEY UPDATE b = c;

如果您指定 ON DUPLICATE KEY UPDATE 子句并且要插入的行会导致 UNIQUE 索引或 PRIMARY KEY 中出现重复值,则会发生旧行的 UPDATE。

Refer this

【讨论】:

  • 就是这样。我想指出 UPDATE 不是我需要的。在这种情况下,它是 IGNORE。但是我看到一些帖子建议不要使用 IGNORE,因为它会忽略任何类型的错误。谢谢
【解决方案2】:

异常用于定义其他意外的行为; “异常”行为。如果您摆脱它们本身就是坏的想法,而是表明它们是无意的行为,那么考虑起来会更容易。

根据您现在所写的内容,使用尝试插入重复记录时引发的异常,我会说这是对异常的正确用法。它标识了您的代码未隐式支持的行为。

但是,也有其他选择。例如,您可以重组您的应用程序以仅在不存在重复项时尝试插入记录。我不确定您的应用程序是什么样的,所以我不确定您是否使用了一个易于实现的框架。用户 eocron 提到 MERGE 命令可能更接近您正在寻找的功能。

如果插入重复项很常见,我个人的理念是避免使用异常,而是应该清理这种行为。

无论如何,我认为您应该以某种方式记录这种异常行为以确定其频率。

【讨论】:

  • 我同意防止异常,但我觉得执行另一个功能来检查它是否存在会更耗时。顺便说一句,您提出了一些好的做法,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2020-07-16
  • 2014-08-15
  • 2012-05-22
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
相关资源
最近更新 更多