【问题标题】:Exclusion constraint for unique constraint, is there a difference?唯一约束的排除约束,有区别吗?
【发布时间】:2017-11-05 17:07:52
【问题描述】:

假设如下表:

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)

?

【问题讨论】:

  • Quote from the manual: "如果所有指定的运算符都测试相等,这相当于一个 UNIQUE 约束,尽管普通的唯一约束会更快"
  • @a_horse_with_no_name:没有明确提及:&& 是否也测试相等性? EXCLUDE USING gist ( person_id WITH =, tstzrange(valid_from, valid_till, '[)' ) WITH && )
  • && 是“重叠”运算符:postgresql.org/docs/current/static/functions-range.html
  • @a_horse_with_no_name: 但它也强制唯一性

标签: postgresql unique-constraint


【解决方案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个事务。

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

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多