2011-11-15 3 views
1

У меня есть таблица MyTable где есть поле 2 уникального ИНТАSQL комплекс ограничения уникальности

# 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))

+0

Почему нет (3,1)? – gbn

+2

Я не понимаю, почему 6-1 терпит неудачу? –

+0

Я нашел аналогичный пример для понимания http://stackoverflow.com/questions/8108205/sql-structuring-a-bi-driectional-graph – uralbash

ответ

5

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

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

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

1

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

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

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(); 

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

+0

ПРИМЕЧАНИЕ: точка с запятой отсутствует перед 'CREATE TRIGGER'; в противном случае он отлично работает (в postgres 9.1.13) – Kenney

Смежные вопросы