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

hir*_*ate 3 database algorithm

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

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

你怎么想?

Jan*_*n S 8

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

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


Nev*_*uyt 5

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

我假设不止一个用户(或进程)可以在任何时候访问您的数据库;如果您纯粹依赖“预插入”检查,则不同的用户可能会在您的检查和您的操作之间更改数据库的状态(例如,插入带有您尝试插入的 ID 的记录)。插入语句。

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

然而,当前的用户界面似乎两者兼而有之——在将数据提交到数据库之前验证数据,很好地处理数据完整性错误。

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

因此,如果您仅将一条记录插入到单个表中,那么使用“重复键”异常就可以了。如果您使用外键等将多条记录插入到多个表中,并且(希望)有一两个事务,那么使用异常的成本很高,并且可能会产生大量的“回滚”工作。

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