Сложное уникальное ограничение SQL - PullRequest
1 голос
/ 15 ноября 2011

У меня есть таблица 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!!!

уникальный ((col1, col2) объединение (col2, col1))

Ответы [ 2 ]

5 голосов
/ 15 ноября 2011

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

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

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

1 голос
/ 15 ноября 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();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...