MySQL là một hệ quản trị cơ sở dữ liệu quan hệ phổ biến, cung cấp khả năng quản lý mối quan hệ giữa các bảng. Một tính năng quan trọng trong MySQL là khóa ngoại (foreign key), giúp đảm bảo tính toàn vẹn dữ liệu giữa các bảng. Trong bài viết này, chúng ta sẽ tìm hiểu khóa ngoại là gì, cách sử dụng, và vai trò của ràng buộc ON DELETE
trong việc duy trì tính nhất quán của cơ sở dữ liệu.
Khóa Ngoại Trong MySQL Là Gì?
Khóa ngoại là một cột (hoặc tập hợp các cột) trong một bảng, tham chiếu đến khóa chính của một bảng khác. Nó thiết lập mối liên kết giữa hai bảng, đảm bảo rằng giá trị trong cột khóa ngoại phải khớp với giá trị trong cột tham chiếu.
Ví Dụ Về Khóa Ngoại
Xem xét hai bảng: users
và orders
.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
order_date DATE,
FOREIGN KEY (user_id) REFERENCES users(id)
);
Ở đây, cột user_id
trong bảng orders
là một khóa ngoại tham chiếu đến cột id
trong bảng users
.
Tại Sao Cần Sử Dụng Khóa Ngoại?
Khóa ngoại đảm bảo tính toàn vẹn dữ liệu bằng cách:
- Ngăn không cho dữ liệu không hợp lệ được chèn vào cột khóa ngoại.
- Tự động thực hiện các thay đổi đối với các hàng liên quan khi dữ liệu tham chiếu được cập nhật hoặc xóa (tùy thuộc vào quy tắc ràng buộc).
Demo Insert Dữ Liệu Không Hợp Lệ.
-- Chèn dữ liệu
INSERT INTO users (name) VALUES ('XinhND');
-- Cố gắng thêm người dùng không tồn tại vào orders
INSERT INTO orders (user_id) VALUES (99);
-- Lỗi: Cannot add or update a child row: a foreign key constraint fails (`test2`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`))
Ràng Buộc ON DELETE Là Gì?
Câu lệnh ON DELETE
xác định hành động cần thực hiện khi một hàng tham chiếu trong bảng cha bị xóa. MySQL hỗ trợ các tùy chọn sau:
ON DELETE CASCADE
Xóa các hàng trong bảng con liên kết với hàng bị xóa trong bảng cha.
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
order_date DATE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
Nếu một người dùng bị xóa khỏi bảng users
, tất cả các đơn hàng của họ trong bảng orders
cũng sẽ bị xóa.
ON DELETE SET NULL
Gán giá trịNULL
cho cột khóa ngoại trong bảng con khi hàng tham chiếu trong bảng cha bị xóa.
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
Nếu một người dùng bị xóa, các đơn hàng của họ sẽ được giữ lại, nhưng cột user_id
trong bảng orders
sẽ được đặt thành NULL
.
ON DELETE RESTRICT
Ngăn không cho xóa một hàng trong bảng cha nếu nó có các hàng phụ thuộc trong bảng con.
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE RESTRICT
Trong MySQL, nếu bạn không chỉ định ràng buộc ON DELETE khi tạo khóa ngoại, giá trị mặc định là RESTRICT. Nếu bạn cố gắng xóa một người dùng có đơn hàng, một lỗi sẽ xảy ra.
-- Chèn dữ liệu
INSERT INTO users (name) VALUES ('Bill');
-- Cố gắng xóa người dùng có đơn hàng
DELETE FROM users WHERE id = 1;
-- Lỗi: Cannot delete or update a parent row: a foreign key constraint fails
ON DELETE NO ACTION
Tương tự nhưRESTRICT
, nhưng hành động này được hoãn lại cho đến khi kết thúcTransaction
.5.ON DELETE SET DEFAULT
Gán giá trị mặc định (nếu được chỉ định) cho cột khóa ngoại khi hàng tham chiếu bị xóa.
Lưu ý : MySQL hiện không hỗ trợ
SET DEFAULT
tính đến phiên bản 8.0.
Khi Nào Sử Dụng Mỗi Loại Ràng Buộc ON DELETE?
Việc lựa chọn ràng buộc ON DELETE
phụ thuộc vào logic ứng dụng của bạn:
- Sử dụng
CASCADE
nếu bạn muốn các bản ghi phụ thuộc tự động bị xóa. - Sử dụng
SET NULL
khi cần giữ lại bản ghi phụ thuộc nhưng loại bỏ liên kết. - Sử dụng
RESTRICT
hoặcNO ACTION
để bảo toàn tính toàn vẹn dữ liệu và ngăn ngừa việc xóa nhầm.
Best Practice Khi Sử Dụng Khóa Ngoại và Ràng Buộc
- Lên Kế Hoạch Quan Hệ Cẩn Thận : Hiểu rõ mối quan hệ giữa các bảng để chọn ràng buộc
ON DELETE
phù hợp. - Tránh Lạm Dụng : Sử dụng khóa ngoại và ràng buộc một cách hợp lý để tránh làm phức tạp thiết kế cơ sở dữ liệu.
- Sử Dụng Transaction : Khi thực hiện các thao tác phức tạp, hãy sử dụng
Transaction
để đảm bảo tính nhất quán.
Kết Luận
Khóa ngoại và ràng buộc ON DELETE
là công cụ quan trọng để duy trì tính toàn vẹn dữ liệu và đơn giản hóa các thao tác cơ sở dữ liệu. Bằng cách hiểu rõ hành vi của chúng và lựa chọn ràng buộc phù hợp với từng trường hợp, bạn có thể thiết kế các lược đồ cơ sở dữ liệu mạnh mẽ, đáp ứng các quy tắc kinh doanh hiệu quả.
Nếu bạn thấy bài viết hữu ích, hãy chia sẻ với bạn bè và đón chờ những mẹo cơ sở dữ liệu khác!