关于sql:在应用程序部分设置MySQL唯一键或检查重复?

Setting MySQL unique key or checking for duplicate in application part?

哪个更可靠,性能更好?设置mysql唯一键,使用insert ignore或first检查数据库中是否存在数据,并根据结果进行操作?

如果答案是第二个,那么有没有办法让一个SQL查询而不是两个?

更新:我问,因为我在公司工作的同事认为,处理这些问题应该在应用程序部分完成,根据他们,这是更可靠的。


您的应用程序不会捕获重复项。

两个并发调用可以插入相同的数据,因为在应用程序检查唯一性时,每个进程都看不到另一个进程。每个过程都认为可以插入。

您可以强制某种类型的序列化,但这样会造成瓶颈和性能限制。您将有其他客户机向数据库写入,即使它只是一个发布脚本。-

这就是为什么通常存在唯一索引和约束的原因。外键、触发器、检查约束、空/niot空、数据类型约束都可以用来强制数据完整性。

还有一些代码猴子的傲慢自大,认为他们可以做得更好。

参见programmers.se:关系数据库中的约束——为什么不完全删除它们?以及在应用程序代码中强制执行数据库约束(so)


设置一个唯一的键更好。它将减少您在单个操作中必须执行的mysql往返次数,并确保项的唯一性,从而减少由您自己的逻辑引起的错误。


无论您决定什么,您都应该在MySQL表中设置一个唯一的键。

至于问题的另一部分,如果您打算对应用程序使用插入-忽略-在重复的密钥更新中使用插入-忽略。

也就是说,如果你要加载一堆数据,而你不关心旧数据是什么,你只需要新数据,这就是你要做的。

另一方面,如果存在某种基于更改是更新还是新值的决策分支,我认为您必须使用选项2。

也就是说,如果对表的更改记录在其他表中(例如,表:用列更改日志:id、t able、column、old_val、new_val),则不能只使用insert ignore,因为您永远无法分辨哪些值已更改,哪些值是新插入的。