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

时间:2017-11-05 13:01:48

标签: postgresql unique-constraint

假设下表:

<input type='text' value='Hello world' placeholder='Save as .txt' id='save' autofocus='' />
<a id='link' target='_blank' onclick='txt(this);' download='note.txt'><input type='button' value='Save as .txt' /></a>

真正有效的区别是什么:

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

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

我从https://www.postgresql.org/docs/current/static/btree-gist.html获取了这个示例,并且对于他们用CREATE UNIQUE INDEX ON zoo(cage, animal) 代替好老exclude constraint的原因感到困惑。所以我想知道是否真的存在差异。

1 个答案:

答案 0 :(得分:1)

两人做不同的事情。

排除约束正在执行文档所说的内容 - 它保证了一个笼子只有一种类型的动物。笼子里没有狮子和绵羊。

唯一索引/约束表示笼子中没有重复的动物。所以,狮子和羊很好(从那个角度来看)。但是两只狮子或两只羊不是。 (当然,狮子和羊的例子可能很快就会产生令人满意的独特约束)。

可以使用外键约束来处理这种类型的“排除”约束。像这样:

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

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

(在现实生活中,模型会有点复杂。)