2010-01-13 5 views
6

그래서 나는 복합 키, 기본적으로 '사용자 ID'이 테이블이 - 고유해야합니다 '데이터'가이 만 효력을 만들 수 있다면 궁금 해서요, 그러나MySQL의 조건부 복합 키?

(내 다른 질문 SQL table - semi-unique row? 참조) userID가 0이 아닌 경우? 즉, 'userID'- 'data'는 0이 아닌 userID에 대해 고유해야합니다.

아니면 잘못된 나무를 짖고 있습니까?

감사
말라

답변

5

SQL 제약 조건은 테이블의 모든 행에 적용됩니다. 특정 데이터 값에 따라 조건부로 만들 수는 없습니다.

그러나 0이 아닌 NULL을 사용할 수 있으면 고유 제한 조건을 피해 갈 수 있습니다. 고유 제한 조건은 NULL을 갖는 여러 항목을 허용합니다. 그 이유는 고유성은 값이 같음을 의미하기 때문입니다.이 존재할 수 있습니다. 균등 의미는 value1 = value2이 참이어야 함을 의미합니다. 그러나 SQL에서 NULL = NULL을 알 수 없으므로입니다.

CREATE TABLE MyTable (id SERIAL PRIMARY KEY, userid INT, data VARCHAR(64)); 

INSERT INTO MyTable (userid, data) VALUES ( 1, 'foo'); 
INSERT INTO MyTable (userid, data) VALUES ( 1, 'bar'); 
INSERT INTO MyTable (userid, data) VALUES (NULL, 'baz'); 

지금까지 너무 좋아, 이제 다음과 같은 문이 고유 제한 조건을 위반하는 것이라고 생각할 수도 있지만, 그렇지 않은 :

INSERT INTO MyTable (userid, data) VALUES ( 1, 'baz'); 
INSERT INTO MyTable (userid, data) VALUES (NULL, 'foo'); 
INSERT INTO MyTable (userid, data) VALUES (NULL, 'baz'); 
INSERT INTO MyTable (userid, data) VALUES (NULL, 'baz'); 
+0

최고, 감사합니다! 내가 다른 솔루션을 사용했다고 말했지만 내 질문에 대한 완벽한 답을 주었고 의심 할 여지없이 미래에 사용할 것입니다 =) – Mala