복붙노트

[SQL] ALTER 테이블은 복합 기본 키를 추가하는

SQL

ALTER 테이블은 복합 기본 키를 추가하는

나는 제공자라는 테이블이 있습니다. 나는 3 열 사람, 장소, 일이라고합니다. 중복 명, 중복 된 장소 및 중복 가지가있을 수 있지만, dupicate 사람 - 장소 - 일 조합이있을 수 없다.

어떻게 ALTER TABLE은이 세 개의 열이있는 MySQL이 테이블 복합 기본 키를 추가하는 것?

해결법

  1. ==============================

    1.

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

    기본 키가 이미 존재하는 경우에는이 작업을 수행 할 수

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

    2.@Adrian 콘월어의 대답은 올바른 것입니다. 그러나, 기존의 기본 키를 삭제 또 다른주의해야 할 점은있다. 그 기본 키는 다른 테이블에서 외래 키로 사용되는 경우 드롭하려고 할 때 오류가 발생합니다. MySQL의 일부 버전에서 오류 메시지가이 오류 메시지는 여전히 (5.5.17의 거기, 부정했다

    @Adrian 콘월어의 대답은 올바른 것입니다. 그러나, 기존의 기본 키를 삭제 또 다른주의해야 할 점은있다. 그 기본 키는 다른 테이블에서 외래 키로 사용되는 경우 드롭하려고 할 때 오류가 발생합니다. 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의 문서를 참조하십시오.

  3. ==============================

    3.당신은 단순히 고유 제한 할 수 있습니다. 특히 이미 대리 키가있는 경우. (이미 존재하는 대용 키의 예는 AUTO_INCREMENT 단일 열 것)

    당신은 단순히 고유 제한 할 수 있습니다. 특히 이미 대리 키가있는 경우. (이미 존재하는 대용 키의 예는 AUTO_INCREMENT 단일 열 것)

    다음은 고유 제한 조건에 대한 SQL 코드는

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

    4.

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

    5.그것은`은 확실히 더 나은 @GranadaCoder가 제공으로, 조금하지만 까다로운 예를 비트, 복합 UNIQUE KEY를 사용합니다 :

    그것은`은 확실히 더 나은 @GranadaCoder가 제공으로, 조금하지만 까다로운 예를 비트, 복합 UNIQUE KEY를 사용합니다 :

    ALTER은 (SOME_ID, another_id, one_more_id) table_name 테이블의 ADD 유니크 INDEX의 idx_name를 무시;

  6. ==============================

    6.ALTER의 table_name 테이블 DROP PRIMARY KEY는 PRIMARY KEY (col_name1, col_name2)를 추가;

    ALTER의 table_name 테이블 DROP PRIMARY KEY는 PRIMARY KEY (col_name1, col_name2)를 추가;

  7. from https://stackoverflow.com/questions/8859353/alter-table-to-add-a-composite-primary-key by cc-by-sa and MIT license