답변:
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);