postgresql Уникальность для двух полей независимо от порядка значений в этих полях

Рейтинг: 2Ответов: 1Опубликовано: 12.07.2023

Как создать таблицу, чтоб уникальность значений двух столбцов, осуществлялась как слева направо, так и наоборот справа налево? типа такого

CREATE TABLE name (
    id      INT     NOT NULL,
    name    VARCHAR NOT NULL,
    name2  VARCHAR NOT NULL,
    PRIMARY KEY (id),
    CONSTRAINT unique_name UNIQUE (name2, name) and CONSTRAINT unique_name2 UNIQUE (name, name2)
);

Другими словами 'Игорь', 'Иван' и 'Иван', 'Игорь' - одно и тоже, и попытка записать второй вариант вызывала бы ошибку уникальности.

Ответы

▲ 1

Как вариант, предложенный на основном SO: Postgresql enforce unique two-way combination of columns, создать уникальный индекс с применением функций greatest / least для пары полей:

CREATE TABLE name ( 
  id INT NOT NULL, 
  name VARCHAR NOT NULL, 
  name2 VARCHAR NOT NULL, 
  PRIMARY KEY (id) 
);

create unique index idx_both on name(greatest(name,name2), least(name,name2));

insert into name(id, name, name2) values (1, 'Jack', 'Doe');
insert into name(id, name, name2) values (2, 'Doe', 'Jack');

результат на SQLFiddle (Postgres 9.6):

ERROR: duplicate key value violates unique constraint "idx_both"
  Detail: Key ((GREATEST(name, name2)), (LEAST(name, name2)))=(Jack, Doe) already exists.