2012-06-24 29 views
5

Sự khác nhau trong hai câu sau đây là gì CREATE TABLE? (Cái đầu tiên sử dụng KEY và cái thứ hai không.)Sự khác biệt trong việc tạo ra NGOẠI HỐI

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 
) 

Cả hai đều tạo bảng hợp lệ. Chúng khác nhau như thế nào và tôi muốn sử dụng cái nào?

Trả lời

7

Chúng là (gần như *) giống nhau.

Khi bạn tạo ràng buộc khóa ngoài, chỉ mục được tạo ra trên (các) cột có liên quan của bảng tham chiếu tự động nếu không có chỉ mục phù hợp nào tồn tại.

Từ trang hướng dẫn trên FOREIGN KEY Constraints:

InnoDB đòi hỏi chỉ số trên phím nước ngoài và các phím tham chiếu để kiểm tra chính nước ngoài có thể được nhanh chóng và không đòi hỏi một bảng quét. Trong bảng tham chiếu, phải có một chỉ mục trong đó các cột khóa ngoài được liệt kê là các cột đầu tiên trong cùng một thứ tự. Chỉ mục như vậy được tạo tự động trên bảng tham chiếu nếu nó không tồn tại. Chỉ mục này có thể bị mất âm thầm sau này, nếu bạn tạo một chỉ mục khác có thể được sử dụng để thực thi ràng buộc khóa ngoài. index_name, nếu được, được sử dụng như được mô tả trước đây.

Mỏ nhấn mạnh.


(*) tôi nói gần cùng bởi vì có một vài sự khác biệt tinh tế.

Tên của chỉ số

Trong phiên bản đầu tiên mà bạn đã đưa ra các chỉ số một cái tên rõ ràng, nhưng trong phiên bản thứ hai tên của chỉ số này giống như tên của ràng buộc (nếu nó được quy định).

Hãy so sánh đầu ra của SHOW INDEX trong cả hai trường hợp:

Phiên bản 1:

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

Version 2:

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

Như bạn thấy, sự khác biệt duy nhất ở đây là tên của chỉ mục.

Im lặng thả

Một khác biệt tinh tế được rằng trong trường hợp thứ hai, như các tài liệu đề cập đến, chỉ số tự động tạo ra có thể là âm thầm giảm khi chỉ số mới được thêm vào:

chỉ số này có thể được thả xuống âm thầm sau đó, nếu bạn tạo một chỉ mục khác có thể được sử dụng để thực thi ràng buộc khóa ngoài.

Điều này có nghĩa là nếu sau này bạn tạo ra một chỉ số multicolumn trên, ví dụ, (order_number, title):

CREATE INDEX ix_order_number_title ON title (order_number, title); 

Sau đó chạy SHOW INDEX một lần nữa:

Phiên bản 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   ... 

Phiên bản 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   ... 

Bây giờ bạn có thể thấy phiên bản đầu tiên có hai chỉ mục nhưng phiên bản thứ hai chỉ có một. Với phiên bản thứ hai, chỉ mục được tạo tự động bởi ràng buộc khóa ngoài được tự động giảm lại khi chỉ mục đa cột được thêm vào. Thông thường, đây không phải là vấn đề nghiêm trọng vì chỉ mục mới làm cho chỉ mục ban đầu chủ yếu là dư thừa.

Tôi muốn sử dụng cái nào?

Thông thường bạn không cần phải lo lắng về việc tạo chỉ mục rõ ràng trên bảng tham chiếu của ràng buộc khóa ngoài.

Nhưng bạn có thể muốn tạo một chỉ mục một cách rõ ràng nếu:

  • bạn muốn cung cấp cho nó một cái tên khác với tên của các hạn chế, hoặc
  • bạn không muốn các chỉ số để âm thầm biến mất khi các chỉ số khác được thêm vào.
+0

Điều này có đúng với MyISAM không? – lee

+1

@lee MyISAM không hỗ trợ các ràng buộc khóa ngoại. – David542

+0

Câu trả lời hay, cảm ơn bạn! – David542

Các vấn đề liên quan