2014-02-10 5 views
0

사용자를 연결하는 관계 테이블을 만들려고합니다.SQL 서버 데이터베이스 열의 고유 한 조합을 만드는 방법

1. id 
2. fromuserid 
3. touserid 
4. state (none, send, accepted, rejected) 

내가 /에에서 어떤 쌍 고유해야합니다 제약 조건을 갖고 싶어 :

나는 다음과 같은 구조를 가지고있다. 나는 같은 항목이 있어서는 안된다는 의미입니다.

1, **123,124**, send 
2, **124,123**, send 

우선 나는! =에서부터 제약 조건을 만들었습니다. 완벽하게 작동합니다 :

CONSTRAINT [CK__FromUserId_ToUserId] CHECK (FromUserId != ToUserId), 

그런 다음 고유 한 색인, 제약 조건 등을 만들려고 시도했지만 아무런 도움이되지 않았습니다.

CONSTRAINT [CK_FromUserId_ToUserId_Combination] UNIQUE (FromUserId, ToUserId) 

또는

CREATE UNIQUE NONCLUSTERED INDEX [IX_FromUserId_ToUserId_Combination] 
    ON USERLINKS (FromUserId, ToUserId) 

모두 같은 기록을 거부 잘 작동 :

1, 123,124,send 
2, 123,124,send 

그러나 아무도는 같은 레코드를 거부 작동하지 않습니다 :

1, 123,124,send 
2, 124,123,send 

012을 알려주십시오을

답변

1

계산 된 열을 사용하여이 작업을 수행 할 수 있습니다. 그것을 당신의 연결 기술적 질문에 대답 할 수 있지만 대신 "INSERT 트리거의"

alter table relationships 
    add leastId as (case when fromuserid < touserid then fromuserid else touserid end); 

alter table relationships 
    add greatestId as (case when fromuserid < touserid then touserid else fromuserid end); 

create unique index relatinonships_leastId_greastestId_Combination 
    on relationships(leastId, greatestId, combination); 
1
+0

다음 "leastId"와 "greatestId"열을 추가 한 다음에 인덱스를 생성 여기에 자신의 말로 대답의 핵심 부분을 바꿔 말할 수 있다면 더 좋을 것입니다. 그렇게하면 정보가 바로 여기에 표시되며 링크 된 페이지가 언젠가 이동하더라도 계속 사용할 수 있습니다. –