Khái niệm cơ bản về khóa ngoại trong MySQL?


91

Có lời giải thích tốt nào về cách sử dụng cấu trúc khóa ngoại của MySQL không?

Tôi không hiểu nó từ chính tài liệu MySQL. Cho đến bây giờ tôi vẫn xử lý những thứ như khóa ngoại với các phép nối và mã lập trình.

Và phần thứ hai của câu hỏi, có bất kỳ cải tiến nào được thực hiện bằng cách sử dụng các khóa ngoại có sẵn của MySQL không?

Câu trả lời:


117

FOREIGN KEYS chỉ cần đảm bảo dữ liệu của bạn nhất quán.

Họ không cải thiện các truy vấn theo nghĩa hiệu quả, họ chỉ thực hiện một số truy vấn sai.

Nếu bạn có một mối quan hệ như thế này:

CREATE TABLE department (id INT NOT NULL)
CREATE TABLE employee (id INT NOT NULL, dept_id INT NOT NULL, FOREIGN KEY (dept_id) REFERENCES department(id))

, sau đó bạn không thể xóa a departmentnếu nó có một số employee.

Nếu bạn cung cấp ON DELETE CASCADEcho FOREIGN KEYđịnh nghĩa, các hàng tham chiếu sẽ tự động bị xóa cùng với các hàng được tham chiếu.

Như một hạn chế, FOREIGN KEYthực sự làm chậm các truy vấn một chút.

Việc kiểm tra bổ sung cần được thực hiện khi xóa khỏi bảng tham chiếu hoặc chèn vào bảng tham chiếu.


1
Tốc độ chậm là tối thiểu, bởi vì bạn thường tạo FK trên các trường được lập chỉ mục, điều này giúp việc tìm kiếm các giá trị liên quan trở nên nhanh chóng.
Seb

4
Đó là lý do tại sao tôi đã viết "một chút" :) Trên thực tế, các bạn rất nhiều xóa các hàng, các lớp dưới JOINcó thể ít nhiều hiệu quả mà hai của DELETE sử dụng của ĐẦY ĐỦ TABLE SCAN
Quassnoi

2
Xin lỗi vì đã bỏ phiếu xuống. Đó là tình cờ, nhưng nó không cho phép tôi thay đổi phiếu bầu của mình.
Wondercricket

8
@Wondercricket: Tôi thậm chí không biết phải làm gì bây giờ, đó là vùng màu xám trong quy tắc trang web. Tôi nghĩ rằng bạn mua cho tôi một cốc bia khi bạn ở Moscow và chúng tôi đồng đều.
Quassnoi

1
@stack: bất kỳ cập nhật nào bạn thực hiện đối với khóa được tham chiếu sẽ chuyển sang bảng tham chiếu.
Quassnoi

32

Các lợi ích chính của việc sử dụng khóa ngoại thực là đảm bảo tính toàn vẹn của dữ liệu và có thể thiết lập các hành động xếp tầng trên các mục liên quan khi một cái gì đó được sửa đổi hoặc xóa.

Ví dụ, hãy tưởng tượng bạn đang lập trình một diễn đàn. Bạn có một bảng "chủ đề" với khóa chính topics.topic_idvà bạn có một bảng "bài đăng" nơi các bài đăng được đính kèm với các chủ đề với cột posts.topic_id, là một khóa ngoại cho bảng chủ đề.

Mối quan hệ khóa ngoài này đảm bảo rằng mọi bài đăng đều được gắn với một chủ đề hợp lệ. Nếu chủ đề duy nhất của bạn có ID # 1, thì không thể có bài đăng trong cơ sở dữ liệu được đính kèm với chủ đề # 2. Cơ sở dữ liệu đảm bảo điều này.

Đối với lợi ích xếp tầng, bạn có thể thiết lập nó để nếu một chủ đề bị xóa khỏi bảng chủ đề, cơ sở dữ liệu sẽ tự động xóa tất cả các bài đăng trong bảng bài đăng đã được đính kèm với chủ đề này. Điều này rất hay vì nó loại bỏ một bước mà bạn phải nhớ làm theo cách thủ công, có thể khá phức tạp khi bạn có nhiều bảng được liên kết với nhau. Với khóa ngoài, tất cả các mối quan hệ có thể được dọn dẹp tự động.


11

1. CÁC KHÓA NGOẠI LỆ chỉ đảm bảo dữ liệu của bạn nhất quán.

2. Nếu chúng ta áp dụng cách xóa tầng cho định nghĩa khóa ngoại, hàng tham chiếu sẽ tự động xóa khi hàng mẹ sẽ xóa.

3. Nếu chúng tôi áp dụng Cập nhật Cascade cho định nghĩa khóa ngoại, Hàng con sẽ tự động cập nhật khi hàng mẹ cập nhật.

Truy vấn: ALTER TABLE con THÊM TỪ KHÓA NGOẠI LỆ (parent_id) THAM KHẢO phụ huynh (id) TRÊN CẬP NHẬT CASCADE TRÊN XÓA CASCADE;

  1. bạn không thể xóa bảng cha trực tiếp, trước tiên xóa khóa ngoại từ bảng con hơn xóa bảng cha.

7
Cuối cùng nhận ra điều gì làm tôi bối rối về các ví dụ khóa nước ngoài. Là một ông bố 4 con, tôi không quen với việc con cái phải theo dõi cha mẹ . Trong khoảng bốn mươi năm nữa, điều này có vẻ không còn ngược nữa.
Bob Stein

1
Cảm ơn bạn đã đặt tên cho bảng mẫu của bạn như "con" và "cha mẹ" ... nó thực sự khá hữu ích và tôi ước tài liệu chính thức đã làm được điều đó!
loài gặm nhấm mike

7

Ưu điểm chính là bạn có thể giới hạn giá trị nào bạn có thể nhập vào bảng; nếu bạn cố gắng nhập một giá trị không tồn tại trong bảng được tham chiếu, bạn sẽ không thể thực hiện được.

Ngoài ra, nếu bạn cập nhật hoặc xóa giá trị trong bảng được tham chiếu, bạn có thể đặt nó tự động cập nhật giá trị hoặc xóa theo tầng bất kỳ hàng nào có chứa giá trị đó.

Nó thực sự là một tính năng tuyệt vời tận dụng mã của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.