唯一约束的排除约束,有区别吗?

时间:2017-11-05 17:07:53

标签: postgresql unique-constraint

假设下表:

CREATE TABLE zoo (
    cage   INTEGER,
    animal TEXT,
);

之间存在真正有效的区别:

ALTER TABLE zoo ADD CONSTRAINT x EXCLUDE USING gist (cage WITH =, animal WITH =)

CREATE UNIQUE INDEX ON zoo(cage, animal)

1 个答案:

答案 0 :(得分:1)

我在排除约束的作者博客上看到了这个:

http://thoughts.davisjeff.com/2010/09/25/exclusion-constraints-are-generalized-sql-unique/

DROP TABLE IF EXISTS a;
CREATE TABLE a(i int);
ALTER TABLE a ADD EXCLUDE (i WITH =);

这与a.i上的UNIQUE约束相同,只是它使用了排除约束机制;它甚至使用普通的BTree来强制执行它。由于UNIQUE约束的一些微优化,性能会稍微差一些,但只是略微,性能特征应该是相同的(它只是可扩展)。最重要的是,它在高并发性下的行为与UNIQUE约束相同,因此您不必担心过度锁定。如果一个人插入5,这将阻止其他事务同时插入5,但不会干扰插入事务6。

这或多或少回答了这个问题。