C# 尝试重复SQL插入时,是否可以使用异常来标记?

C# 尝试重复SQL插入时,是否可以使用异常来标记?,c#,mysql,sql,C#,Mysql,Sql,场景 我有一个数据库,它有两个同名的相等表(我们称它们为Table1和Table2)。 表1通过一个C#程序定期向表2发送一组数据。 其中一些数据已经在表2中,因此cmd上会弹出一个简单的异常,程序继续运行。我不需要重复的数据,所以这很好,程序的工作方式完全符合我的要求 我的问题 我想知道C#query函数必须管理如此多的异常(20%的插入是重复的,并且指向异常)是否可以。因为虽然程序可以工作,但函数可能对程序本身无效或“有害”(以某种未知的方式,例如,导致更多的延迟) 如果是这样,我如何从一个

场景

我有一个数据库,它有两个同名的相等表(我们称它们为Table1和Table2)。 表1通过一个C#程序定期向表2发送一组数据。 其中一些数据已经在表2中,因此cmd上会弹出一个简单的异常,程序继续运行。我不需要重复的数据,所以这很好,程序的工作方式完全符合我的要求

我的问题

我想知道C#query函数必须管理如此多的异常(20%的插入是重复的,并且指向异常)是否可以。因为虽然程序可以工作,但函数可能对程序本身无效或“有害”(以某种未知的方式,例如,导致更多的延迟)

如果是这样,我如何从一个简单的“插入到”查询中解决这个问题?
是否有任何命令可以使其成为“执行此操作的好方法”?

异常用于定义其他意外行为;“特殊”行为。如果你不认为它们本质上是坏的,而认为它们是意料之外的行为,那么你就更容易思考

根据您现在所写的内容,在尝试插入重复记录时使用抛出的异常,我认为这是异常的正确用法。它标识代码不隐式支持的行为

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

我个人的理念是,如果插入重复项很常见,那么就避免使用异常,而应该对这种行为进行消毒


无论如何,我相信你应该以某种方式记录这种异常行为,以确定其发生频率。

异常用于定义其他意外行为;“特殊”行为。如果你不认为它们本质上是坏的,而认为它们是意料之外的行为,那么你就更容易思考

根据您现在所写的内容,在尝试插入重复记录时使用抛出的异常,我认为这是异常的正确用法。它标识代码不隐式支持的行为

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

我个人的理念是,如果插入重复项很常见,那么就避免使用异常,而应该对这种行为进行消毒


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

由于您使用的是MySql,因此可以使用此语法使所有语句完整无误

INSERT INTO T1 (a, b)
    SELECT a, b FROM T2
ON DUPLICATE KEY UPDATE b = c;
如果指定ON DUPLICATE KEY UPDATE子句,并且要插入的行将导致唯一索引或主键中出现重复值,则会更新旧行


由于您使用的是MySql,因此可以使用此语法使所有语句完整无误

INSERT INTO T1 (a, b)
    SELECT a, b FROM T2
ON DUPLICATE KEY UPDATE b = c;
如果指定ON DUPLICATE KEY UPDATE子句,并且要插入的行将导致唯一索引或主键中出现重复值,则会更新旧行


适用于无法在复制上使用更新命令的用户。我想指出,存在一个名为IGNORE的命令。它是这样使用的:

INSERT IGNORE INTO table (param1, ...) VALUES (value1, ...)
如果出现任何错误,查询只会通知您,而不会取消操作。我很有用,因为我必须使用的数据库用户只有插入权限

  • 更新使用SELECT命令

适用于无法在复制上使用更新命令的用户。我想指出,存在一个名为IGNORE的命令。它是这样使用的:

INSERT IGNORE INTO table (param1, ...) VALUES (value1, ...)
如果出现任何错误,查询只会通知您,而不会取消操作。我很有用,因为我必须使用的数据库用户只有插入权限

  • 更新使用SELECT命令

您需要查找MERGE命令。如果遇到重复,您可以决定怎么做;如果不存在,则插入(删除/更新可以存根)。@eocron我很确定这是防止重复的最佳选择。但是这根短梗似乎有点生锈了,不是吗?应该存在对复制不执行任何操作的选项。如果不支持,post your answerMySQL不支持MERGE@eocron我想知道为什么在列相同的情况下需要两个表..是的,我知道
INSERT-INTO。。。在重复密钥更新中…
@T.S.仅仅告诉MySQL不支持
MERGE
,未来的读者可能会阅读
MERGE
,并认为他们可以在MySQL中使用它。您需要查找MERGE命令。如果遇到重复,您可以决定怎么做;如果不存在,则插入(删除/更新可以存根)。@eocron我很确定这是防止重复的最佳选择。但是这根短梗似乎有点生锈了,不是吗?应该存在对复制不执行任何操作的选项。如果不支持,post your answerMySQL不支持MERGE@eocron我想知道为什么在列相同的情况下需要两个表..是的,我知道
INSERT-INTO。。。在重复密钥更新中…
@T.S.仅仅告诉MySQL不需要