8

曾经有人告诉我,只运行插入并让插入失败比检查数据库条目是否存在然后插入是否丢失要快。

我还被告知,大多数数据库都针对阅读而不是写作进行了大量优化,所以快速检查不会比慢速插入更快吗?

这是预期碰撞次数的问题吗?(IE 只有在条目已经存在的可能性很小的情况下才插入更快。)它是否取决于我正在运行的数据库类型?就此而言,拥有一种不断将插入错误添加到我的错误日志的方法是不好的做法吗?

谢谢。

4

5 回答 5

8

如果插入由于索引违规而失败,它最多会比检查记录是否存在慢一点。(两者都需要检查索引是否包含该值。)如果插入要成功,那么发出两个查询比发出一个要慢得多。

于 2012-01-20T05:02:42.700 回答
0

您可以使用INSERT IGNORE这样,如果键已经存在,则插入命令将被忽略,否则将插入新行。这样,您需要发出一个查询,该查询检查重复值并插入新值。
仍然要小心 INSERT IGNORE 因为它会将每个错误都变成警告。阅读这篇文章插入忽略
重复键忽略?

于 2012-01-20T05:11:54.863 回答
0

我认为 INSERT IGNORE INTO .... 可以在这里使用,它会插入或忽略它。如果使用 IGNORE 关键字,则执行 INSERT 语句时发生的错误将被视为警告。例如,如果没有 IGNORE,复制表中现有 UNIQUE 索引或 PRIMARY KEY 值的行会导致重复键错误并且语句被中止。使用 IGNORE,行仍然没有插入,但不会发出错误。

于 2012-01-20T05:17:14.417 回答
0

如果要删除旧值并插入新值,可以使用REPLACE您可以使用 REPLACE 而不是 INSERT 来覆盖旧行。

REPLACE 的工作方式与 INSERT 完全相同,只是如果表中的旧行与 PRIMARY KEY 或 UNIQUE 索引的新行具有相同的值,则在插入新行之前删除旧行。

否则使用INSERT IGNORE因为它会插入或忽略。

复制表中现有 UNIQUE 索引或 PRIMARY KEY 值的行会导致重复键错误并且语句被中止。使用 IGNORE,行仍然没有插入,但不会发出错误。

于 2012-01-20T05:21:58.190 回答
0

如果您的意图是插入新记录或更新记录(如果已存在),那么如何进行 UPSERT?

退房 - http://vadivel.blogspot.com/2011/09/upsert-insert-and-update-in-sql-server.html

我们可以尝试直接更新它,而不是检查记录是否存在。如果没有匹配的记录,则@@RowCount 将为 0。基于此,我们可以将其作为新记录插入。[在 SQL Server 2008 中,您可以为此使用 MERGE 概念]

编辑:请注意,我知道这适用于 MS SQL Server,但我不了解 MySQL 或 ORACLE

于 2012-01-20T05:25:21.957 回答