唯一约束的排除约束,有区别吗? (之二)
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)
);
(模型在现实生活中会更复杂一些。)
假设以下 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)
);
(模型在现实生活中会更复杂一些。)