postgresql对两列(或数组)中任何整数的唯一约束

时间:2016-12-02 14:43:06

标签: postgresql

如何保证两列/数组中任何整数的唯一性?

示例:我创建一个表并在其中插入一行:

CREATE TABLE mytest(a integer NOT NULL, b integer NOT NULL);
INSERT INTO mytest values (1,2);

我应创建哪些UNIQUE INDEX以不允许添加以下任何值

INSERT INTO mytest values (1,3); # because 1 is already there
INSERT INTO mytest values (3,1); # because 1 is already there
INSERT INTO mytest values (2,3); # because 2 is already there
INSERT INTO mytest values (3,2); # because 2 is already there

如果它有所帮助,我可以有两个元素的数组而不是两列。

当然,我可以发明一些解决方法,以下是我的想法:

  • 为所有数字创建单独的表,在那里有unique index,并使用事务向两个表添加值。如果该号码不是唯一的,则不会将其添加到第二个表中,并且交易失败
  • 添加两行而不是一行,并为id-of-the-pair添加其他字段。

但是我想要一个表,我需要一行,其中包含两个元素。这可能吗?

1 个答案:

答案 0 :(得分:5)

您可以在表格上使用排除约束以及intarray来快速执行重叠数组的搜索:

CREATE EXTENSION intarray;
CREATE TABLE test (
    a int[],
    EXCLUDE USING gist (a gist__int_ops WITH &&)
);

INSERT INTO test values('{1,2}');

INSERT INTO test values('{2,3}');
>> ERROR:  conflicting key value violates exclusion constraint "test_a_excl"
>> DETAIL:  Key (a)=({2,3}) conflicts with existing key (a)=({1,2}).