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

Ada*_*m S 3 sql unique

我正在开发一个大型数据库,我正在寻找可以加速数据库的一切。问题是:当您在某些字段上有唯一索引时,发出选择请求以检查它是否正常,或者尝试它并在条目已经存在时捕获异常之间的速度有多快?

我做了一些研究,但没有定论。谢谢。

Mik*_*ll' 5

手动检查不会做您认为的那样。(见下文。)

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

无论如何,您必须捕获错误。重复值只是插入时可能出错的件事;还有很多其他事情可能会出错。

我说只是插入,并捕获错误。


INSERT 之前的 SELECT 的要点是确定数据库中是否已经存在一个值。但是你不能依靠它来工作。这是为什么。

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

create table test (
  test_id serial primary key, 
  test_email varchar(15) not null unique
);
Run Code Online (Sandbox Code Playgroud)
A:开始交易;
A: 选择 test_email 
   从测试 
   其中 test_email = 'a@b.com';
   (0 行)

                                       B:开始交易;

A:插入测试(test_email) 
   值('a@b.com');
   插入 0 1

                                       B: 选择 test_email 
                                          从测试 
                                          其中 test_email = 'a@b.com';
                                          (0 行)
                                       B:插入测试(test_email) 
                                          值('a@b.com');
                                          (等待锁定)

答:提交;

                                       B:错误:重复键值 
                                          违反唯一约束...