programing

복합 기본 키를 추가하기 위한 ALTER TABLE

randomtip 2022. 10. 22. 09:44
반응형

복합 기본 키를 추가하기 위한 ALTER TABLE

테이블이 있어요provider...라는 세 개의 컬럼이 있습니다.person,place,thing중복된 사람, 중복된 장소, 중복된 것이 있을 수 있지만 중복된 사람-위치-물건의 조합은 있을 수 없습니다.

이 3개의 컬럼을 가진 MySQL에서 이 테이블의 복합 프라이머리 키를 추가하려면 어떻게 테이블을 변경할 수 있습니까?

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);

같은 것이 아닙니다.두 필드 모두 3개의 필드 집합에서 고유성을 적용하지만 인덱싱의 관점에서 보면 차이가 있습니다.필드는 왼쪽에서 오른쪽으로 색인화됩니다.예를 들어 다음 쿼리를 고려합니다.

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가 제공한 것처럼 조금 까다로운 예시를 사용하는 것이 좋습니다.

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);

언급URL : https://stackoverflow.com/questions/8859353/alter-table-to-add-a-composite-primary-key

반응형