Khóa ngoại (Foreign Key) là một ràng buộc dùng để tạo liên kết giữa hai bảng trong cơ sở dữ liệu. Khóa ngoại là một cột hoặc một tập hợp các cột trong bảng mà giá trị của chúng phải khớp với giá trị của khóa chính (Primary Key) ở bảng khác. Điều này giúp đảm bảo tính toàn vẹn dữ liệu, ngăn chặn việc thêm các bản ghi con mà không có bản ghi cha tương ứng.
Một khóa ngoại được định nghĩa khi tạo bảng mới hoặc có thể được thêm vào bảng hiện có. Cấu trúc chung:
CONSTRAINT constraint_name FOREIGN KEY (local_column) REFERENCES foreign_table (foreign_column) ON DELETE action ON UPDATE action;
CASCADE, SET NULL, RESTRICT,…).Giả sử bạn có hai bảng: orders và customers. Mỗi đơn hàng trong bảng orders sẽ chứa một cột customer_id tham chiếu đến cột id của bảng customers.
CREATE TABLE customers (
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50)
);
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
order_date DATE,
customer_id INT,
CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
Trong ví dụ trên:
orders có khóa ngoại customer_id tham chiếu đến cột id của bảng customers.ON DELETE CASCADE: Nếu một khách hàng bị xóa khỏi bảng customers, tất cả các đơn hàng tương ứng trong bảng orders cũng sẽ bị xóa.ON UPDATE CASCADE: Nếu id của khách hàng bị thay đổi, customer_id trong bảng orders cũng sẽ được cập nhật tương ứng.Nếu bảng đã tồn tại và bạn muốn thêm khóa ngoại, bạn có thể sử dụng câu lệnh ALTER TABLE.
Ví dụ: Thêm khóa ngoại vào bảng orders đã tồn tại.
ALTER TABLE orders ADD CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE ON UPDATE CASCADE;
Bạn có thể xóa khóa ngoại bằng cách sử dụng câu lệnh ALTER TABLE với tùy chọn DROP FOREIGN KEY.
Ví dụ: Xóa khóa ngoại fk_customer khỏi bảng orders.
ALTER TABLE orders DROP FOREIGN KEY fk_customer;
ON DELETE và ON UPDATEKhi tạo khóa ngoại, bạn có thể chỉ định hành động sẽ được thực hiện khi một hàng trong bảng tham chiếu bị xóa hoặc cập nhật. Các hành động phổ biến bao gồm:
NULL khi hàng tham chiếu bị xóa hoặc cập nhật.RESTRICT, nhưng hành động sẽ diễn ra sau khi các trigger được xử lý.Ví dụ các hành động:
ON DELETE CASCADE: Xóa các hàng trong bảng con khi hàng trong bảng cha bị xóa.ON UPDATE SET NULL: Khi giá trị trong bảng cha được cập nhật, các khóa ngoại tương ứng trong bảng con sẽ được đặt thành NULL.CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
order_date DATE,
customer_id INT,
CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers(id)
ON DELETE SET NULL
ON UPDATE CASCADE
);
Trong ví dụ này:
customers, giá trị customer_id trong bảng orders sẽ được đặt thành NULL.id của khách hàng được cập nhật trong bảng customers, các hàng trong bảng orders sẽ tự động cập nhật theo.Để kiểm tra các khóa ngoại đã tồn tại trong bảng, bạn có thể sử dụng câu lệnh sau:
SHOW CREATE TABLE orders;
Lệnh này sẽ hiển thị toàn bộ cấu trúc của bảng, bao gồm cả các ràng buộc khóa ngoại.
Việc sử dụng khóa ngoại trong MySQL giúp đảm bảo tính toàn vẹn của dữ liệu giữa các bảng liên quan. Bằng cách tạo các ràng buộc khóa ngoại, bạn có thể ngăn chặn việc thêm các bản ghi con mà không có bản ghi cha tương ứng, và xử lý tự động các thay đổi khi dữ liệu trong bảng cha thay đổi.