Огрничение по уникальности сочетаний

big-trot
Дата: 17.12.2014 12:20:23
Есть такая схема
CREATE TABLE public.table1 (
  id SERIAL,
  CONSTRAINT table1_pkey PRIMARY KEY(id)
) 
WITH (oids = false);

CREATE TABLE public.table2 (
  id1 INTEGER NOT NULL,
  id2 INTEGER NOT NULL,
  CONSTRAINT table2_pkey PRIMARY KEY(id1, id2),
  CONSTRAINT table2_fk FOREIGN KEY (id1)
    REFERENCES public.table1(id)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
    NOT DEFERRABLE,
  CONSTRAINT table2_fk1 FOREIGN KEY (id2)
    REFERENCES public.table1(id)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
    NOT DEFERRABLE
) 
WITH (oids = false);

ALTER TABLE public.table2
  ALTER COLUMN id1 SET STATISTICS 0;


Вставляем две записи в table1
INSERT INTO table1 (id) VALUES (1);
INSERT INTO table1 (id) VALUES (2);


Вставляем запись в table2
INSERT INTO table1 (id1,id2) VALUES (1,2);


Вопрос - как запретить вставку в table2 записи (1,2) в другом сочетании (2,1) ?
INSERT INTO table1 (id1,id2) VALUES (2,1);


Как это сделать без триггеров ?
Есть ли возможность использовать ограничения?
Где посмотреть, что почитать ?

Спасибо.
Добрый Э - Эх
Дата: 17.12.2014 12:57:09
big-trot,

уникальное ограничение по least(id1, id2), greatest(id1, id2)?
Maxim Boguk
Дата: 17.12.2014 13:15:02
big-trot,

я бы check ом запретил бы вставку записей где id2<id1 и все.
Это более правильно чем хитрый Unique придумывать.

--Maxim Boguk
www.postgresql-consulting.ru
torbasow
Дата: 20.12.2014 15:45:36
Добрый Э - Эх,

как это возможно технически — ограничение уникальности на выражение? Вы имеете в виду то же, что и мне пришло в голову,— exclusion constraint? Они довольно лаконично описаны в документации.