Khóa ngoại (Foreign Key) trong MySQL
Last updated
Last updated
Thông thường chúng ta có hai loại khóa ngoại đó là khóa ngoại giữa hai bảng và khóa ngoại trỏ đến chính nó (đệ quy). Khóa ngoại giữa hai bảng
Xét sơ đồ CSDL sau đây:
Các bạn thấy trong bảng customers và orders có một mối quan hệ với tên gọi là "mỗi order là của một customer nào đó". đây ta gọi là mối quan hệ (1:n), có nghĩa là một customer có thê có nhiều orders và mỗi order chỉ thuộc về một customer duy nhất. Xem kỹ hơn ta thấy trong bảng orders có field customerNumber
và nó sẽ trỏ đến khóa chính (Primary Key) của bảng customers.
Xét sơ đồ CSDL sau đây:
Trong sơ đồ này nó có một khóa ngoại là reportsTo
và trỏ đến chính khóa chính của nó employeeNumber
. Mối quan hệ này ta nói như sau "mỗi nhân viên có thể là một nhân viên bình thường hoặc là người quản lý của một nhân viên khác. Hằng ngày các nhân bị quản lý khác sẽ báo cáo (reportsTo) tới nhân viên quản lý". Sơ đồ này ta gọi là đệ quy, nghĩa là khóa ngoại sẽ tham chiếu tới chính table nó luôn. Trong thực tế cũng hay gặp trường hợp này nên các bạn cần lưu ý nhé.
Chúng ta sẽ tạo trực tiếp trong lệnh tạo bảng và cú pháp của nó cũng tương tự như lệnh tạo khóa chính, nghĩa là sẽ đặt ở cuối phần khai báo field. Nếu sử dụng cách này thì khóa ngoại sẽ không có tên.
Các bạn thấy tôi đã sử dụng từ khóa FOREIGN KEY (groupid) REFERENCES Groups(groupid)
để tạo khóa ngoại, trong đó:
FOREIGN KEY (groupid)
: là field được chọn làm khóa ngoại ở bảng con, tức là bảng Users.
REFERENCES Groups(groupid)
: là khóa chính của bảng cha, tức là bảng Groups.
Sau khi tạo xong bạn vào PHPMyAdmin và chọn mục database, chọn diagram ở thanh công cụ thì lúc này bạn sẽ thấy một sơ đồ như sau:
Như vậy là bạn đã tạo thành công rồi đấy
Tương tự như các phần trước, để đặt tên cho khóa ngoại thì ta phải sử dụng từ khóa CONSTRAINT
.
Với cách này ta phải tạo hai bảng trước, sau đó sẽ dùng lệnh ALTER TABLE
để thêm FOREIGN KEY
.
Trường hợp này ta cũng sử dụng cú pháp tương tự, thay vì tham chiếu tới bảng nào đó thì sẽ tham chiếu đến chính nó.
Để xóa được Foreign Key thì bạn phải biết tên của nó là gì, mà tên chỉ tồn tại trong trường hợp ta có sử dụng từ khóa CONSTRAINT lúc tạo khóa, vì vậy khuyến khích bạn sử dụng CONSTRAINT
để tạo khóa ngoại.
Sau đây là cú pháp xóa Foreign Key:
Trong đó fk_group
là tên của khóa ngoại.
Lưu ý quan trọng:
Bạn chỉ thực hiện được thao tác xóa khi không tồn tại một bảng con nào tham chiếu đến nó.