Сложное уникальное ограничение SQL

У меня есть таблица mytable, где находится 2 уникальных поля int

# SQLAlchemy example
mytable = Table('mytable', meta,

# per-column anonymous unique constraint
Column('col1', Integer, unique=True),
Column('col2', Integer, unique=True),

# explicit/composite unique constraint.  'name' is optional.
UniqueConstraint('col1', 'col2', name='uix_1')
)

Как сделать такие ограничения:

col1 col2
1      
2     6
3     1
4     5
5
6     1 -- FAIL: becouse 3-1 is exist and 2-6 is exist!!!

уникальный ((столбец1, столбец2) объединение (столбец2, столбец1))


person uralbash    schedule 15.11.2011    source источник
comment
Я не понимаю, почему 6-1 терпит неудачу?   -  person a_horse_with_no_name    schedule 15.11.2011
comment
Я нашел аналогичный пример для понимания stackoverflow.com /вопросы/8108205/   -  person uralbash    schedule 16.11.2011


Ответы (2)


Вы можете использовать что-то вроде этого в качестве ограничения:

create table example (
    col1 integer,
    col2 integer,
    CHECK (col1 < col2),
    UNIQUE(col1, col2)
);

Если вы хотите, чтобы он автоматически делал col1 меньше, чем col2, используйте триггер :)

person Wolph    schedule 15.11.2011

Я думаю, что вы не можете добиться этого, используя ограничение.

Вы можете использовать триггер:

CREATE TABLE test (a int, b int);

CREATE OR REPLACE FUNCTION fun_test()
  RETURNS trigger
  LANGUAGE plpgsql
AS
$body$
BEGIN
    if (TG_OP = 'INSERT') then
        if (exists(SELECT 1 FROM test t WHERE t.b = NEW.a) -- or whatever condition you want
            and exists(SELECT 1 FROM test t WHERE t.b = NEW.b))
          then
            RAISE EXCEPTION 'Can''t insert (%,%)', NEW.a, NEW.b;
        end if;
    return NEW;
    end if;
END;    
$body$

  CREATE TRIGGER tgr_test BEFORE INSERT
      ON test FOR EACH ROW
 EXECUTE PROCEDURE fun_test();

Обратите внимание, что вы также должны проверять обновления.

person DavidEG    schedule 15.11.2011
comment
ПРИМЕЧАНИЕ: перед CREATE TRIGGER отсутствует точка с запятой; в остальном работает нормально (в postgres 9.1.13) - person Kenney; 30.09.2014