应检查重复数据库还是从数据库中捕获异常?

时间:2011-09-16 09:48:46

标签: database algorithm

当我们使用数据库编程时(例如在Java和MySql中),我们应该在插入之前检查重复条目,还是应该插入并捕获重复的异常以向用户发出警报?

在我看来,如果我们进行检查,如果没有重复的条目,我们插入条目,数据库引擎本身再次检查重复的主键。这听起来浪费时间。

你觉得怎么样?

2 个答案:

答案 0 :(得分:8)

如果有重复的密钥,您可以检查客户端(在您的程序中),这将需要查询数据库。如果已存在具有相同PK的记录,则插入查询将返回错误,因此在发送insert语句之前不必执行此检查。
您可以插入,捕获异常/错误代码(我不确定它是否会在java中提供异常,或返回错误代码)然后提醒用户。

编辑 -
如果有许多用户使用相同的数据库,则检查然后插入的主要问题是其他人可以在您选中但插入之前插入相同的密钥。如果您希望以这种方式执行此操作,则需要使用事务 - 检查和插入必须同时发生在同一事务中。您可以阅读MySQL事务here

答案 1 :(得分:3)

浪费时间不是你最关心的问题。

我假设任何时候都有多个用户(或进程)可以访问您的数据库;如果您完全依赖于“预插入”检查,则可以让不同的用户在您的检查和您的检查之间的时间内更改数据库的状态(例如,插入包含您尝试插入的ID的记录)插入声明。

因此,您应该始终以用户友好的方式处理“重复键”错误。

但是,当前的用户界面似乎同时执行这两项操作 - 在将数据提交到数据库之前验证数据,很好地处理数据完整性错误。

这样做有几个原因 - 一个用户友好,但效率和性能也是一个大问题。在大多数应用程序中,数据库是“稀缺资源”,依赖于应用程序逻辑的错误是昂贵且低效的。

因此,如果您只是将单个记录插入单个表中,则使用“重复键”异常就可以了。如果你要插入多个记录,多个表,外键等等(并希望)一两个事务,使用异常是很昂贵的,可能会产生很多“回滚”的努力。

在MySQL上,对事务的不同支持(取决于您使用的版本和存储选项)会加剧这种情况。