SQL에서 복합 기본 키를 어떻게 정의 할 수 있습니까?


112

SQL에서 두 필드로 구성된 복합 기본 키를 어떻게 정의 할 수 있습니까?

나는 PHP를 사용하여 테이블과 모든 것을 만들고 있습니다. 나는 테이블 이름을 만들고 싶어 voting필드 QuestionID, MemeberIDvote. 그리고 복합 기본 키는 필드 QuestionIDMemberID.

어떻게해야합니까?


"그리고 QuestionID와 MemberID가 기본 키가됩니다." (QuestionID, MemberID)는 (복합) 기본 입니다. 키는 하나 뿐이며 두 개의 열로 구성됩니다.
Draemon 2009-07-10

답변:


229

설명을 위해 테이블에는 기본 키가 하나만있을 수 있습니다. 기본 키는 (해당 테이블에서) 하나 이상의 열로 구성됩니다. 기본 키가 둘 이상의 열로 구성된 경우 복합 기본 키 라고합니다 . 다음과 같이 정의됩니다.

CREATE TABLE voting (
  QuestionID NUMERIC,
  MemberID NUMERIC,
  PRIMARY KEY (QuestionID, MemberID)
);

쌍 (QuestionID, MemberID)은 테이블에 대해 고유해야하며 두 값 모두 NULL이 될 수 없습니다. 다음과 같은 쿼리를 수행하는 경우 :

SELECT * FROM voting WHERE QuestionID = 7

기본 키의 색인을 사용합니다. 그러나 이렇게하면 :

SELECT * FROM voting WHERE MemberID = 7

복합 색인을 사용하려면 "왼쪽"의 모든 키를 사용해야하기 때문이 아닙니다. 인덱스가 필드 (A, B, C)에 있고 기준이 B와 C에있는 경우 해당 인덱스는 해당 쿼리에 사용할 수 없습니다. 따라서 (QuestionID, MemberID) 및 (MemberID, QuestionID) 중 테이블 사용 방법에 가장 적합한 것을 선택하십시오.

필요한 경우 다른 인덱스를 추가하십시오.

CREATE UNIQUE INDEX idx1 ON voting (MemberID, QuestionID);

5
좋은 대답입니다. 명확히하기 위해 QuestionID와 MemberID는 별도의 기본 키가 아니라 이들의 조합이 고유 한 쌍 / 튜플을 형성합니다.
Peter

5
(MemberID, QuestionID)단지 반대되는 인덱스를 추가하는 것이 이점이 MemberID있습니까? 내가 이해하는 한 QuestionId, 및으로 선택할 때 색인화 된 조회가 표시 (QuestionId, MemeberId)되므로 누락 된 유일한 항목은 MemberId유일합니다.
swalog

나는이 답변이 꽤 오래되었다는 것을 알고 있지만 Google 검색 중에 팝업 되었기 때문에 ... 기본 색인에 대해 사용되거나 사용되지 않는 열에 대한 텍스트에 불일치가있는 것 같습니다. 또한 모든 RDBMS가 기본 키에 대한 인덱스를 자동으로 생성한다고 가정하지만 표준에서 필요하지 않기 때문에 코너 케이스가있을 수 있습니다.
로 마 SE

두 필드는 다른 테이블에서 단순한 (그리고 아마도 주) 키 복합 키없는 복합 키는 예 쇼이므로
guymid

6
CREATE TABLE `voting` (
  `QuestionID` int(10) unsigned NOT NULL,
  `MemberId` int(10) unsigned NOT NULL,
  `vote` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`QuestionID`,`MemberId`)
);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.