场景
我有一个数据库,其中包含两个名称不同的EQUAL表(我们将其称为Table1和Table2)。 Table1通过C#程序定期向Table2发送一堆数据。 这些数据中的一些已经在Table2中,因此在cmd上弹出一个简单的Exception,程序继续运行。我不需要重复的数据,所以很好,该程序可以按照我想要的方式正常工作。
我的问题
我想知道C#查询功能是否可以管理如此之类的异常(这种情况是重复的(有20%的插入重复并指向该异常)),是否可以。因为尽管程序可以运行,但对于程序本身,该功能可能效率低下或“有害”(例如,以某种未知的方式,导致更多的延迟)。
如果可以,如何通过简单的“ INSERT INTO”查询解决此问题? 是否有任何命令使其成为“执行此操作的好方法”?
答案 0 :(得分:3)
由于您使用的是 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。
答案 1 :(得分:1)
异常用于定义本来无法预期的行为; “异常”行为。如果您不了解它们本身就本质上是不好的,而是要指出意外的行为,则更容易考虑。
对于您现在编写的内容,使用尝试插入重复记录时引发的异常,我想这是对异常的正确用法。它标识了您的代码未隐式支持的行为。
但是,还有其他选择。例如,您可以将应用程序重组为仅在不存在重复项的情况下才尝试插入记录。我不确定您的应用程序是什么样子,因此不确定您是否正在使用使此操作易于实现的框架。 eocron用户提到MERGE命令可能更接近您要寻找的功能。
我的个人观点是,如果要插入重复项很常见,则应避免使用异常,而应该对这种行为进行清理。
无论如何,我相信您应该以某种方式记录这种异常行为以确定其发生频率。
答案 2 :(得分:0)
对于不能在DUPLICATE上使用UPDATE命令的用户。我想指出的是,存在一个名为IGNORE的命令。这样使用:
INSERT IGNORE INTO table (param1, ...) VALUES (value1, ...)
如果发生任何错误,查询将仅对您进行广告,但不会取消该操作。我对我很有用,因为我必须使用的数据库用户仅具有INSERT权限。