SQL唯一性:手动检查与捕获异常



我正在开发一个大型数据库,我正在寻找能够加快数据库速度的一切。问题是:当你在一些字段上有一个唯一的索引时,发出选择请求以检查它是否正常,或者无论如何都尝试它并在条目已经存在的情况下捕获异常,两者之间的速度是什么?

我做了一些研究,但没有得出结论。谢谢

手动检查不会做你认为它会做的事情。(见下文。)

如果您先进行检查,每次插入都需要两次往返数据库。它可能还需要可序列化的事务。

无论如何,你都必须捕捉错误。重复值只是一个可能在插入时出错的东西;还有很多其他事情可能会出错。

我说只要插入,并陷阱的错误。


在INSERT之前执行SELECT的目的是确定数据库中是否已经存在一个值。但你不能依赖它来工作。原因如下。

打开两个终端会话(例如),并将这两个会话都连接到数据库。此表已存在。它是空的。

create table test (
  test_id serial primary key, 
  test_email varchar(15) not null unique
);
A: 开始交易;A: 选择test_email来自测试其中test_email="a@b.com";(0行)B: 开始交易;A: 插入测试(test_email)值('a@b.com');插入0 1B: 选择test_email来自测试其中test_email="a@b.com";(0行)B: 插入测试(test_email)值('a@b.com');(正在等待锁定)A: 承诺;B: 错误:键值重复违反了唯一约束。。。

您有两个选择

  1. 尝试插入,如果查询失败,您将捕获并回滚事务
  2. 尝试查询一次以检查它是否存在。如果不存在,请插入值

在我看来,第一个更好,因为如果你查询两次,你会使用两次网络连接。当你有非常大的数据时,选择也是一个很好的选择。在第一种情况下,您尝试插入,但得到DataIntegrityException。单个请求和响应比两个请求和两个响应要好。

事务管理器也可以处理异常。

我的理解是try/catch异常会突然停止程序流。即使处理得当。建议的做法是将它们与域逻辑分开使用。一个额外的选择应该不会那么糟糕,除非你的数据库服务器在物理上很远。

最新更新