[mysql] 복합 기본 키를 올바르게 작성하는 방법-MYSQL

여기에 내가 작업하고있는 강렬한 설정이 지나치게 단순화되었습니다. table_1그리고 table_2모두는 ID로 자동 증가 대리 기본 키를 가지고있다. 및 info에 대한 정보가 포함 된 테이블입니다 .table_1table_2

table_1 (id, field)  
table_2 (id, field, field)
info ( ???, field)

난의 기본 키해야하는 경우 결정하려고 info에서 ID의 합성을 table_1하고 table_2. 이 작업을 수행 할 경우이 중 가장 적합한 것은 무엇입니까?
(이 예에서는 ID 11209와 ID 437을 결합하고 있습니다)

INT(9)11209437 (이것이 왜 나쁜지 상상할 수 있습니다)
VARCHAR (10) 11209-437
DECIMAL (10,4)11209.437

또는 다른 것?

이것을 MYSQL MYISAM DB의 기본 키로 사용하는 것이 좋습니까?



답변

복합 (다열) 키를 사용합니다.

CREATE TABLE INFO (
    t1ID INT,
    t2ID INT,
    PRIMARY KEY (t1ID, t2ID)
) 

이 방법으로 t1ID 및 t2ID를 해당 테이블을 가리키는 외래 키로 사용할 수 있습니다.


답변

“info”테이블의 기본 키를 다른 테이블의 두 값을 합성하지 않습니다.

다른 사람들은 그 이유를 더 잘 설명 할 수 있지만 실제로 두 가지 정보로 구성된 열을 갖는 것은 잘못된 느낌입니다. 어떤 이유로 두 번째 테이블의 ID를 정렬하려면 어떻게합니까? 두 테이블의 값이 존재하는 횟수를 세려면 어떻게해야합니까?

나는 항상 이것을 두 개의 별개의 열로 유지합니다. mysql … PRIMARY KEY (id_a, id_b)에서 2 열 primay 키를 사용할 수 있지만 2 열 고유 인덱스를 사용하고 자동 증가 기본 키 필드를 선호합니다.


답변

구문은 CONSTRAINT constraint_name PRIMARY KEY(col1,col2,col3)예를 들어 ::

CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)

위의 예제는 테이블을 만드는 동안 작성하는 경우 작동합니다.

CREATE TABLE person (
   P_Id int ,
   ............,
   ............,
   CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
);

기존 테이블에이 제한 조건을 추가하려면 다음 구문을 따라야합니다.

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (P_Id,LastName)


답변

이미 테이블을 생성했다고 가정하면이 쿼리를 사용하여 복합 기본 키를 만들 수 있습니다

alter table employee add primary key(emp_id,emp_name);


답변

개인 디자인 환경 설정 외에도 복합 기본 키를 사용하려는 경우가 있습니다. 테이블에는 고유 한 조합을 제공하는 두 개 이상의 필드가있을 수 있으며 반드시 외래 키를 사용할 필요는 없습니다.

예를 들어, 각 미국 주에는 고유 한 의회 지구가 있습니다. 많은 주에서 개별적으로 CD-5가있을 수 있지만 50 개 주 중 하나에 CD-5가 두 개 이상 존재하지 않으며 그 반대도 마찬가지입니다. 따라서 매사추세츠 CD-5에 대한 자동 번호 필드를 만드는 것은 중복됩니다.

데이터베이스가 동적 웹 페이지를 구동하는 경우 두 필드 조합에서 쿼리 할 코드를 작성하는 것이 자동 번호 매기기 키를 추출 / 다시 제출하는 것보다 훨씬 간단 할 수 있습니다.

따라서 원래의 질문에 대답하지는 않지만 Adam의 직접적인 답변에 감사드립니다.


답변

복합 기본 키는 팩트 테이블과 다 대 다 관계를 작성하려는 위치입니다. 예를 들어, 여러 속성이 포함 된 휴가 용 렌탈 패키지가있을 수 있습니다. 반면에, 본 숙소는 단독으로 또는 다른 숙박 시설과 함께 여러 임대 패키지의 일부로 이용 가능합니다. 이 시나리오에서는 속성 / 패키지 팩트 테이블을 사용하여 속성과 임대 패키지 간의 관계를 설정합니다. 속성과 패키지 간의 연결은 고유하며 property_id를 속성 테이블과 함께 사용하거나 package_id를 패키지 테이블과 함께 사용하여 조인 할 수 있습니다. 각 관계는 고유하며 auto_increment 키는 다른 테이블에 표시되지 않으므로 중복됩니다. 따라서 복합 키를 정의하는 것이 답입니다.


답변

CREATE  TABLE `mom`.`sec_subsection` (

  `idsec_sub` INT(11) NOT NULL ,

  `idSubSections` INT(11) NOT NULL ,

  PRIMARY KEY (`idsec_sub`, `idSubSections`) 

);