У меня есть следующая таблица в postgres 9.5:
CREATE TABLE public.test
(
id bigint NOT NULL DEFAULT nextval('test_id_seq'::regclass),
id1 integer,
id2 integer,
CONSTRAINT test_pkey PRIMARY KEY (id)
);
Я хочу добавить ограничения на оба столбца, которые разрешают только наборы записей, где
- новый набор записей (id1, id2) отсутствует и
- новый набор записей (id1, id2) отсутствует как (id2, id1), а
- id1 и id2 нового набора записей не равны
Это должно выглядеть так:
id | id1 | id2
---------------
1 | 1 | 1 <-- invalid (violates restriction 3.)
2 | 1 | 2 <-- valid
3 | 1 | 2 <-- invalid (violates restriction 1.)
4 | 2 | 1 <-- invalid (violates restriction 2.)
5 | 3 | 1 <-- valid
6 | 3 | 2 <-- valid
Для ограничения 1 я добавил:
ALTER TABLE test ADD CONSTRAINT test_id1_id2_unique UNIQUE(id1, id2);
Но как добавить ограничения для 2. и 3.?
Окончательное решение с помощью a_horse_with_no_name:
CREATE TABLE public.test(
id bigint NOT NULL DEFAULT nextval('test_id_seq'::regclass),
id1 integer NOT NULL,
id2 integer NOT NULL,
CONSTRAINT test_pkey PRIMARY KEY (id),
CONSTRAINT test_check CHECK (id1 <> id2)
);
CREATE UNIQUE INDEX test_id1_id2_unique
ON public.test
USING btree
((LEAST(id1, id2)), (GREATEST(id1, id2)));