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


195

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

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

답변:


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

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

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

17
@ David542 아니요, 기본 키는 1 개만 가질 수 있습니다.
Adrian Cornish

35
@David : 복합 키와 같은 여러 필드로 구성된 단일 기본 키입니다.
Marc B

3
@ David542 물론 가능합니다-이것은 3 개의 필드로 구성된 복합 기본 키입니다. 3 개의 필드 조합은 고유해야합니다.
Adrian Cornish

2
게시 주셔서 감사합니다 - 정말 UI와 싸우고 생각을 가지고
plditallo

1
SO에서 가장 귀중한 답변 중 하나 :)
alwbtc

21

@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의 문서를 참조하십시오 여기에 자세한 내용은.


@All-같은 JPA 동등 물을 공유해 주시겠습니까?
Pra_A

17

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

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

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

고맙습니다. 제약 조건은 내가 원하는 것입니다.이 초기 게시물에서 무엇을 요구 해야할지 몰랐습니다. 이것을 스레드에 추가해 주셔서 감사합니다.
ZaneDarken December

나는 일반적으로 대리 키를 사용합니다 ... 그런 다음 고유 제약 조건을 추가합니다. 이런 식으로 .. "고유성 (uniqueness)"이 길을 따라 변한다면, 기본 키를 어지럽히는 것보다 제약을 조정하는 것은 그리 드라마 적이 지 않습니다. 외래 키가이 테이블을 참조하는 자식 테이블이있는 경우 3 개 열 모두가 아닌 대리 키만 FK하면됩니다. –
granadaCoder 2014


1

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

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


0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.