两列的唯一约束,与顺序无关

时间:2020-02-25 14:41:40

标签: sql postgresql create-table unique-constraint

我有一个非常简单的表:

    id  | name   | alternate
--------+--------+------------
     1  |   Joe  |     Joseph
--------+--------+------------
     2  |   Pete |     Peter
--------+--------+------------

以此类推。

我想在名称和替代列上添加一个约束,但是不考虑顺序。例如,我不希望能够插入(3, 'Peter', 'Pete'),因为它实际上与id 2相同,而只是反转了列。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

创建唯一索引:

CREATE UNIQUE INDEX ON atable
   (LEAST(name, alternate), GREATEST(name, alternate));

答案 1 :(得分:1)

您可以创建唯一索引:

create unique index my_unique_idx
on mytable(least(name, alternate), greatest(name, alternate));

Demo on DB Fiddle

create table mytable (name varchar(10), alternate varchar(10));

create unique index my_unique_idx
on mytable(least(name, alternate), greatest(name, alternate));

insert into mytable values('foo', 'bar');
-- 1 rows affected

insert into mytable values('bar', 'foo')
-- ERROR:  duplicate key value violates unique constraint "my_unique_idx"
-- DETAIL:  Key (LEAST(name, alternate), GREATEST(name, alternate))=(bar, foo) already exists.