唯一约束的排除约束,有区别吗? (之二)

Exclusion constraint for unique constraint, is there a difference? (bis)

假设以下 table:

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)

?

我从 https://www.postgresql.org/docs/current/static/btree-gist.html 中拿了这个例子,我很困惑为什么他们用 exclude constraint 而不是旧的 unique constraint 来表示这个。所以我想知道是否真的有区别。

两者做的事情不同

排除约束正是按照文档中的说明进行操作的——它保证笼子里只有一种动物。笼子里没有狮子和羊。

独特的index/constraint说笼子里没有重复只动物。所以,狮子和绵羊很好(从那个角度来看)。但两只狮子或两只羊却不是。 (当然,狮子和绵羊的例子很可能会很快得到满足的唯一约束)。

这种类型的 "exclusion" 约束可以使用外键约束来处理。像这样:

CREATE TABLE cages (
    CageId serial,
    AnimalType varchar(255)  -- or whatever
);

CREATE TABLE CageAnimals (
    CageAnimalId serial,
    CageId int references Cages(CageId)
    AnimalName varchar(255)
);

(模型在现实生活中会更复杂一些。)