2014-07-06 3 views
1

SQLite3에서 나는 반사적 관계를 나타내는 테이블을 가지고 있습니다. 이것은 내가 그것을 생성하는 방법입니다SQL의 반사적 관계에서 중복 레코드 피하기

CREATE TABLE relationships (
    id_relationship INT, 
    id_person_1 INT NOT NULL, 
    id_person_2 INT NOT NULL, 
    description VARCHAR2(300), 

    PRIMARY KEY(id_relationship), 
    FOREIGN KEY(id_person_1) REFERENCES people(id_person), 
    FOREIGN KEY(id_person_2) REFERENCES people(id_person), 
    CONSTRAINT relationship_not_repeated UNIQUE(id_person_1, id_person_2), 
    CONSTRAINT ids_not_equal CHECK(id_person_1 != id_person_2) 
); 

난 내가 일어날 수있는이 같은 동일한 유형 및 무언가의 두 외래 키를 가지고 있기 때문에, 중복을 피하기 위해 제약 조건을 추가하고 싶습니다 :

ID_RELATIONSHIP ID_PERSON_1  ID_PERSON_2 DESCRIPTION 
--------------- --------------- ------------- --------------- 
1    114    115   family 
2    115    114   family 

답변

3

을 이를 수행하는 가장 쉬운 방법은 id_person_1 < id_person_2을 요구하는 것입니다. 당신은 create table 문에 점검 제한 조건을 추가하여이 작업을 수행 할 수 있습니다 : 당신이 할 경우, 당신은 일을 기대하는 일부 삽입 문이 작동하지 않을 수도 있음을

check (id_person_1 < id_person_2); 

참고. insert 트리거를 추가하여이 문제를 해결할 수 있습니다. 두 사람의 값이 바뀌면 작은 것이 먼저 표시됩니다.

+0

와우, 나는 그것을 알지 못했습니다. 매우 쉽고 편합니다. 그리고 ORM으로 Java를 사용하기 때문에 어떤 트리거도 필요하지 않습니다. 그래서해야 할 일은 가장 높은 id를 id_person_1에 넣고 다른 하나를 id_person_2에 넣는 것입니다. 고마워요;) – ivan0590

+0

내가 잘못 말했다. 나는 더 작은 id를 id_person_1에, 가장 큰 것을 id_person_2에 넣을 것이라고 말하고 싶다. 다시 한번 감사드립니다. – ivan0590