Khóa Ngoại (Foreign Key) Trong MySQL: Định Nghĩa, Cách Tạo Và Xóa Chi Tiết

Trong thế giới quản trị cơ sở dữ liệu, chúng ta đã làm quen với các lệnh tạo bảng (CREATE TABLE), khái niệm về khóa chính (PRIMARY KEY) và các thuộc tính như UNIQUE, AUTO_INCREMENT. Tuy nhiên, tất cả những yếu tố này đều hoạt động trên một bảng duy nhất. Vậy, nếu có nhiều bảng, liệu có tồn tại mối liên hệ nào giữa chúng? Câu trả lời là có, và mối liên hệ đó được thể hiện qua khóa ngoại (FOREIGN KEY).

1. Khóa Ngoại (Foreign Key) Là Gì?

Thay vì đi sâu vào định nghĩa phức tạp, ta sẽ tập trung vào bản chất cốt lõi của khóa ngoại. Khóa ngoại biểu thị mối quan hệ giữa hai bảng, thường được mô tả theo mô hình cha – con. Nếu bảng A có một thuộc tính liên kết đến bảng B, thì bảng B đóng vai trò là bảng cha, còn bảng A là bảng con.

Khái niệm khóa ngoại không chỉ giới hạn trong MySQL mà còn là một thành phần quan trọng của hầu hết các hệ quản trị cơ sở dữ liệu (CSDL) như SQL Server, Oracle, Access,… Nếu bạn đã từng nghiên cứu về mô hình CSDL, chắc chắn bạn đã quen thuộc với khái niệm này.

Thông thường, ta có hai loại khóa ngoại chính:

  • Khóa ngoại giữa hai bảng khác nhau.
  • Khóa ngoại trỏ đến chính nó (khóa ngoại đệ quy).

Khóa Ngoại Giữa Hai Bảng

Hãy xem xét sơ đồ CSDL sau:

Alt text: Sơ đồ cơ sở dữ liệu minh họa mối quan hệ giữa bảng khách hàng (customers) và bảng đơn hàng (orders), với khóa ngoại customerNumber trong bảng orders liên kết đến khóa chính của bảng customers.

Trong sơ đồ này, bảng customers (khách hàng) và orders (đơn hàng) có mối quan hệ “mỗi đơn hàng thuộc về một khách hàng”. Đây là mối quan hệ một-nhiều (1:n), nghĩa là một customer có thể có nhiều orders, nhưng mỗi order chỉ thuộc về một customer duy nhất. Quan sát kỹ hơn, ta thấy trong bảng orders có trường customerNumber, trường này tham chiếu đến khóa chính (PRIMARY KEY) của bảng customers.

Từ đó, ta rút ra kết luận quan trọng:

Khóa ngoại trong bảng orders tham chiếu đến khóa chính của bảng customers. Bảng customers được gọi là bảng cha, còn bảng orders là bảng con. Đây là nguyên tắc BẮT BUỘC của khóa ngoại.

Khóa Ngoại Trỏ Đến Chính Bảng Đó (Khóa Ngoại Đệ Quy)

Xét sơ đồ CSDL sau:

Sơ đồ bảng employees với khóa ngoại trỏ đến chính nóSơ đồ bảng employees với khóa ngoại trỏ đến chính nó

Trong sơ đồ này, ta thấy có một khóa ngoại là reportsTo và nó trỏ đến chính khóa chính employeeNumber của bảng employees. Mối quan hệ này có thể được hiểu là “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 viên bị quản lý sẽ báo cáo (reportsTo) cho nhân viên quản lý của họ”. Đây là một ví dụ về quan hệ đệ quy, trong đó khóa ngoại tham chiếu đến chính bảng mà nó thuộc về. Trong thực tế, kiểu quan hệ này khá phổ biến, vì vậy bạn cần đặc biệt lưu ý.

2. Tạo Khóa Ngoại (Foreign Key) Trong MySQL

Chúng ta sẽ sử dụng cú pháp T-SQL để tạo khóa ngoại. Có nhiều cách để tạo khóa ngoại, tùy thuộc vào nhu cầu cụ thể của bạn. Tuy nhiên, tất cả các cách đều có chung một cấu trúc cơ bản: khai báo trường của bảng A và chỉ định trường mà nó sẽ tham chiếu đến ở bảng B bằng từ khóa REFERENCES.

Tạo Khóa Ngoại Trong Lệnh CREATE TABLE

Chúng ta có thể tạo khóa ngoại trực tiếp trong lệnh CREATE TABLE. Cú pháp này tương tự như lệnh tạo khóa chính, được đặt ở cuối phần khai báo các trường. Khi sử dụng cách này, khóa ngoại sẽ không có tên.

Ví dụ:

CREATE TABLE Users (
    userid INT PRIMARY KEY,
    username VARCHAR(50),
    groupid INT,
    FOREIGN KEY (groupid) REFERENCES Groups(groupid)
);

Trong đoạn code trên, ta sử dụng từ khóa FOREIGN KEY (groupid) REFERENCES Groups(groupid) để tạo khóa ngoại, trong đó:

  • FOREIGN KEY (groupid): là trường đượ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 có thể vào PHPMyAdmin, chọn database, chọn “diagram” ở thanh công cụ. Lúc này, bạn sẽ thấy một sơ đồ trực quan thể hiện mối quan hệ giữa hai bảng.

Alt text: Hình ảnh sơ đồ cơ sở dữ liệu hiển thị mối quan hệ giữa hai bảng thông qua khóa ngoại, được tạo bằng PHPMyAdmin.

Ví dụ đặt tên cho khóa ngoại:

Tương tự như khi tạo khóa chính, để đặt tên cho khóa ngoại, ta sử dụng từ khóa CONSTRAINT.

CREATE TABLE Users (
    userid INT PRIMARY KEY,
    username VARCHAR(50),
    groupid INT,
    CONSTRAINT FK_GroupUser FOREIGN KEY (groupid) REFERENCES Groups(groupid)
);

Tạo Khóa Ngoại Bằng Lệnh ALTER TABLE

Với cách này, ta cần tạo hai bảng trước, sau đó sử dụng lệnh ALTER TABLE để thêm khóa ngoại.

CREATE TABLE Users (
    userid INT PRIMARY KEY,
    username VARCHAR(50),
    groupid INT
);

CREATE TABLE Groups (
    groupid INT PRIMARY KEY,
    groupname VARCHAR(50)
);

ALTER TABLE Users
ADD CONSTRAINT FK_GroupUser
FOREIGN KEY (groupid) REFERENCES Groups(groupid);

Hoặc:

ALTER TABLE Users
ADD FOREIGN KEY (groupid) REFERENCES Groups(groupid);

Tạo Khóa Ngoại Tham Chiếu Chính Nó

Trường hợp này, ta sử dụng cú pháp tương tự, nhưng thay vì tham chiếu đến một bảng khác, ta sẽ tham chiếu đến chính nó.

CREATE TABLE Employees (
    employeeNumber INT PRIMARY KEY,
    employeeName VARCHAR(50),
    reportsTo INT,
    FOREIGN KEY (reportsTo) REFERENCES Employees(employeeNumber)
);

3. Xóa (Drop) Khóa Ngoại

Để xóa khóa ngoại, bạn cần biết tên của nó. Tên này chỉ tồn tại khi bạn sử dụng từ khóa CONSTRAINT khi tạo khóa ngoại. Vì vậy, chúng tôi khuyến khích bạn nên sử dụng CONSTRAINT khi tạo khóa ngoại.

Cú pháp xóa khóa ngoại:

ALTER TABLE Users
DROP FOREIGN KEY FK_GroupUser;

Trong đó FK_GroupUser là tên của khóa ngoại cần xóa.

Lưu ý quan trọng:

Bạn chỉ có thể xóa khóa ngoại khi không có bảng con nào tham chiếu đến nó.

4. Lời Kết

Trong bài viết này, chúng ta đã tìm hiểu về định nghĩa của khóa ngoại (FOREIGN KEY) và các cách tạo khóa ngoại thông dụng trong MySQL. Bài viết kết thúc tại đây. Trong các bài viết tiếp theo, chúng ta sẽ tìm hiểu về lệnh ALTER TABLE và các ứng dụng khác của nó.