2012-06-24 4 views
5

다음 두 문 CREATE TABLE의 차이점은 무엇입니까? (첫 번째 KEY 사용하고, 두 번째는 포함하지 않습니다.)외부 키 생성의 차이점

CREATE TABLE `title` (
    `title` VARCHAR(255) NOT NULL, 
    `order_number` VARCHAR(35) NOT NULL, 
    KEY `order_number` (`order_number`), 
    CONSTRAINT `order_number_fk` FOREIGN KEY (`order_number`) 
     REFERENCES `order` (`order_number`) ON DELETE CASCADE 
) 

CREATE TABLE `title` (
    `title` VARCHAR(255) NOT NULL, 
    `order_number` VARCHAR(35) NOT NULL, 
    CONSTRAINT `order_number_fk` FOREIGN KEY (`order_number`) 
     REFERENCES `order` (`order_number`) ON DELETE CASCADE 
) 

을 둘 다 유효 테이블을 만들 수 있습니다. 그들은 어떻게 다르고 어떤 것을 사용하고 싶습니까?

답변

7

이들은 (거의 *) 동일합니다.

외래 키 제약 조건을 만들면 적합한 색인이 이미없는 경우 색인이 참조 테이블의 관련 열에 자동으로 만들어집니다. 매뉴얼 페이지에서

FOREIGN KEY Constraints에 : 외래 키 검사가 신속하고 테이블 스캔을 필요로하지 수 있도록

InnoDB하지만 외래 키와 참조 키에 대한 인덱스를 필요로한다. 참조하는 테이블에는 외부 키 열이 같은 순서로 첫 번째 열로 나열되는 인덱스가 있어야합니다. 이러한 인덱스는 참조 테이블에없는 경우 자동으로 작성됩니다. 외래 키 제약 조건을 적용하는 데 사용할 수있는 다른 인덱스를 만드는 경우 나중에이 인덱스가 자동으로 삭제 될 수 있습니다. index_name이 주어지면 앞에서 설명한대로 사용됩니다.

강조 광산.


(*) 나는 거의 같은 때문에 거기에 약간의 미묘한 차이는 말한다.

인덱스

인덱스를 명시 적으로 이름을 준 첫 번째 버전에서

하지만 두 번째 버전에서 인덱스의 이름이 제약 조건의 이름과 같은 이름 (이 경우 지정됨).

버전 1 :

 
Table Non_unique Key_name   Seq_in_index Column_name ... 
title 1   order_number  1    order_number ... 

버전 2 :

 
Table Non_unique Key_name   Seq_in_index Column_name ... 
title 1   order_number_fk 1    order_number ... 

당신이 볼 수 있듯이, 여기에 유일한 차이점 이름입니다

두 경우 모두 SHOW INDEX의 출력을 비교 색인

이 지수는 수도 :

자동

을 또 다른 미묘한 차이가 문서는 언급으로 두 번째 경우에, 자동으로 생성 된 인덱스가 자동으로 할 새 인덱스가 추가 될 때 감소 할 수 있다는 것입니다 삭제 외래 키 제약 조건을 적용하는 데 사용할 수있는 다른 인덱스를 만드는 경우 나중에 자동으로 삭제됩니다.

CREATE INDEX ix_order_number_title ON title (order_number, title); 

그런 다음 다시 SHOW INDEX을 실행합니다 :

버전 1 :

 
Table Non_unique Key_name    Seq_in_index Column_name ... 
title 1   order_number   1    order_number ... 
title 1   ix_order_number_title 1    order_number ... 
title 1   ix_order_number_title 2    title   ... 

를이 의미

나중에 예에 멀티 컬럼 인덱스, (order_number, title)을 만드는 경우이다 버전 2 :

 
Table Non_unique Key_name    Seq_in_index Column_name ... 
title 1   ix_order_number_title 1    order_number ... 
title 1   ix_order_number_title 2    title   ... 

이제 첫 번째 버전에는 두 개의 인덱스가 있지만 두 번째 버전에는 단 하나의 인덱스 만 있음을 알 수 있습니다. 두 번째 버전에서는 다중 열 인덱스가 추가 될 때 외래 키 제약 조건에 의해 자동으로 생성 된 인덱스가 자동으로 다시 삭제되었습니다. 일반적으로 새 색인은 원본 색인이 대부분 중복되기 때문에 심각한 문제는 아닙니다.

어느 것을 사용하고 싶습니까?

일반적으로 외래 키 제약 조건의 참조하는 테이블에 인덱스를 명시 적으로 작성하는 것에 대해 걱정할 필요가 없습니다.

그러나 경우 명시 적으로 인덱스를 생성 할 수 있습니다 : 당신이 그것을 제약의 이름과 다른 이름을 부여하는 것을 선호

  • , 또는
  • 당신은에 인덱스를 원하지 않는다 다른 색인이 추가되면 자동으로 사라집니다.
+0

MyISAM에서도 마찬가지입니까? – lee

+1

@lee MyISAM은 외래 키 제약 조건을 지원하지 않습니다. – David542

+0

위대한 답변, 감사합니다! – David542