48.5. 索引唯一性检查

PostgreSQL 使用 唯一索引来强制 SQL 唯一约束, 唯一索引实际上是不允许多条记录有相同键值的的索引。 一个支持这个特性的访问方法要设置 pg_am.amcanunique 为真。 (目前,只有 b-tree 支持它。)

因为 MVCC,我们必须允许重复的条目物理上存在于索引之中:该条目可能指向某个逻辑行的后面的版本。 我们实际想强制的行为是,任何 MVCC 快照都不能包含两条相同的索引键字。 这种要求在向一个唯一索引插入新行的时候分解成下面的几种情况:

我们要求索引访问方法自己进行这些测试,这就意味着它必须检查堆, 以便查看那些根据索引内容表明有重复键字的任意行的提交状态。 这样做毫无疑问地很难看并且也不是模块化的,但是这样可以节约重复的工作: 如果我们进行额外的一次探测,而后面的索引查找冲突行的的动作实际上是和查找插入新行的索引记录重复的动作。 并且,我们没有很显然的方法来避免冲突条件,除非冲突检查是插入新索引条目的整体动作的一部分。

这个方法的主要的局限是没有很方便的方法支持推迟的唯一性检查。