[mysql] 복합 기본 키를 추가하는 ALTER TABLE

라는 테이블이 provider있습니다. 나는라는 세 개의 열이 person, place, thing. 중복 된 사람, 중복 된 장소 및 중복 된 물건이있을 수 있지만 절대로 사람과 장소를 조합 한 조합은있을 수 없습니다.

이 세 열을 사용하여 MySQL 에서이 테이블에 대한 복합 기본 키를 추가하려면 TABLE을 어떻게 변경합니까?



답변

ALTER TABLE provider ADD PRIMARY KEY(person,place,thing);

기본 키가 이미 존재하는 경우이 작업을 수행하려고합니다

ALTER TABLE provider DROP PRIMARY KEY, ADD PRIMARY KEY(person, place, thing);


답변

@Adrian Cornish의 답변이 맞습니다. 그러나 기존 기본 키를 삭제하는 또 다른 경고가 있습니다. 해당 기본 키를 다른 테이블에서 외래 키로 사용하는 경우 삭제하려고 할 때 오류가 발생합니다. 일부 버전의 mysql에서 오류 메시지가 잘못되었습니다 (5.5.17 현재이 오류 메시지는 여전히

alter table parent  drop column id;
ERROR 1025 (HY000): Error on rename of
'./test/#sql-a04_b' to './test/parent' (errno: 150).

다른 테이블에서 참조하는 기본 키를 삭제하려면 먼저 다른 테이블에서 외래 키를 삭제해야합니다. 기본 키를 다시 만든 후에도 원하는 경우 외래 키를 다시 만들 수 있습니다.

또한 복합 키를 사용할 때는 순서가 중요합니다. 이들

1) ALTER TABLE provider ADD PRIMARY KEY(person,place,thing);
and
2) ALTER TABLE provider ADD PRIMARY KEY(person,thing,place);

같은 것이 아닙니다. 둘 다 해당 세 필드 집합에 고유성을 적용하지만 인덱싱 관점에서 차이가 있습니다. 필드는 왼쪽에서 오른쪽으로 색인됩니다. 예를 들어 다음 쿼리를 고려하십시오.

A) SELECT person, place, thing FROM provider WHERE person = 'foo' AND thing = 'bar';
B) SELECT person, place, thing FROM provider WHERE person = 'foo' AND place = 'baz';
C) SELECT person, place, thing FROM provider WHERE person = 'foo' AND place = 'baz' AND thing = 'bar';
D) SELECT person, place, thing FROM provider WHERE place = 'baz' AND thing = 'bar';

B는 ALTER 문 1
에서 기본 키 인덱스를 사용할 수 있습니다. A ALTER 문 2에서 기본 키 인덱스를
사용할 수 있습니다. C 인덱스 중 하나를 사용할 수 있습니다.
D는 인덱스를 사용할 수 없습니다

A는 인덱스 2의 처음 두 필드를 부분 인덱스로 사용합니다. A는 인덱스의 중간 위치 부분을 모르기 때문에 인덱스 1을 사용할 수 없습니다. 그래도 사람에 대해서만 부분 인덱스를 사용할 수 있습니다.

D는 사람을 모르기 때문에 어느 인덱스도 사용할 수 없습니다.

MySQL의 문서를 참조하십시오 여기에 자세한 내용은.


답변

고유 한 제약 조건을 원할 수도 있습니다. 특히 대리 키가 이미있는 경우에 특히 그렇습니다. (기존의 대리 키의 예는 AUTO_INCREMENT 인 단일 열입니다)

아래는 고유 제한 조건에 대한 SQL 코드입니다.

ALTER TABLE `MyDatabase`.`Provider`
    ADD CONSTRAINT CK_Per_Place_Thing_Unique UNIQUE (person,place,thing)
;


답변

alter table table_name add primary key (col_name1, col_name2);


답변

@GranadaCoder가 제공 한 것처럼 COMPOSITE UNIQUE KEY를 사용하는 것이 좋습니다.

ALTER IGNORE TABLE table_name ADD UNIQUES INDEX idx_name(some_id, another_id, one_more_id);


답변

ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);


답변