Câu trả lời:
Có, nhưng chỉ trên nhà trọ. Innodb hiện là định dạng bảng vận chuyển duy nhất có khóa ngoại được triển khai.
Rõ ràng một chỉ mục được tạo tự động như được chỉ định trong liên kết robert đã đăng .
InnoDB yêu cầu lập chỉ mục trên khóa ngoại và khóa tham chiếu để kiểm tra khóa ngoại có thể nhanh và không yêu cầu quét bảng. 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 theo cùng một thứ tự. Mộ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. (Điều này trái ngược với một số phiên bản cũ hơn, trong đó các chỉ mục phải được tạo rõ ràng hoặc việc tạo các ràng buộc khóa ngoại sẽ thất bại.) Index_name, nếu được đưa ra, được sử dụng như mô tả trước đây.
InnoDB permits a foreign key to reference any index column or group of columns. However, in the referenced table, there must be an index where the referenced columns are the first columns in the same order.
Có, xem các ràng buộc của InnoDB và NGOẠI TỆ .
Bạn không nhận được chỉ mục tự động nếu bạn thực hiện ALTER TABLE (thay vì CREATE TABLE), ít nhất là theo các tài liệu (liên kết dành cho 5.1 nhưng tương tự với 5.5):
[...] Khi bạn thêm một ràng buộc khóa ngoài vào bảng bằng ALTER TABLE, hãy nhớ tạo các chỉ mục cần thiết trước tiên.
Đối với những người đang tìm kiếm trích dẫn từ các 5.7
tài liệu :
MySQL yêu cầu các chỉ mục trên khóa ngoại và khóa tham chiếu để kiểm tra khóa ngoại có thể nhanh và không yêu cầu quét bảng. 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 theo cùng một thứ tự. Mộ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ể được giảm â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. index_name, nếu được cung cấp, được sử dụng như được mô tả trước đây.
Như đã nêu, nó làm cho InnoDB. Lúc đầu, tôi nghĩ thật lạ khi nhiều người khác (đặc biệt là MS SQL và DB2) không có. Quét không gian bảng chỉ tốt hơn quét chỉ mục khi có rất ít hàng trong bảng - vì vậy, trong phần lớn các trường hợp, khóa ngoại sẽ muốn được lập chỉ mục. Sau đó, nó đánh tôi - điều này không nhất thiết có nghĩa là nó phải là một chỉ số độc lập (một cột) - trong đó nó nằm trong Chỉ số FK tự động của MySQL. Vì vậy, có thể đó là lý do MS SQL, DB2 (Oracle tôi không chắc chắn), v.v. để lại cho DBA; sau khi tất cả nhiều chỉ mục trên các bảng lớn có thể gây ra vấn đề về hiệu suất và không gian.
Vâng, Innodb
cung cấp điều này. Bạn có thể đặt một tên khóa ngoại sau FOREIGN KEY
mệnh đề hoặc để nó để cho MySQL tạo tên cho bạn. MySQL tự động tạo một chỉ mục với foreign_key_name
tên.
CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action